#Область ПрограммныйИнтерфейс

#Область СборкаОбработкиДляИсполнения

// Начать сборку обработок для исполнения кода.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения- Форма
//  ОписаниеОповещенияОЗавершении -ОписаниеОповещения-Описание оповещения о завершении
//  ИменаПредустановленныхПеременных - Структура, Неопределено -
//  ИдентификаторыРедакторовДляИсполненияНаКлиенте - Массив из Строка, Неопределено -
Процедура НачатьСборкуОбработокДляИсполненияКода(Форма, ОписаниеОповещенияОЗавершении,
	ИменаПредустановленныхПеременных = Неопределено, ИдентификаторыРедакторовДляИсполненияНаКлиенте = Неопределено) Экспорт
	РедакторыКода = УИ_РедакторКодаКлиентСервер.РедакторыФормы(Форма);

	РедакторыДляСборки = Новый Массив;
	Для Каждого КлючЗначение Из РедакторыКода Цикл
		Если Не КлючЗначение.Значение.ИспользоватьОбработкуДляВыполненияКода Тогда
			Продолжить;
		КонецЕсли;

		ДанныеРедактораДляСборки = УИ_РедакторКодаКлиентСервер.НовыйДанныеРедактораДляСборкиОбработки();
		ДанныеРедактораДляСборки.Идентификатор = КлючЗначение.Ключ;
		Если ИдентификаторыРедакторовДляИсполненияНаКлиенте <> Неопределено Тогда
			ДанныеРедактораДляСборки.ИсполнениеНаКлиенте = ИдентификаторыРедакторовДляИсполненияНаКлиенте.Найти(КлючЗначение.Ключ) <> Неопределено;
		КонецЕсли;
		ДанныеРедактораДляСборки.ТекстРедактора = ТекстКодаРедактора(Форма, КлючЗначение.Ключ);
		ДанныеРедактораДляСборки.ИмяПодключаемойОбработки = УИ_РедакторКодаКлиентСервер.ИмяПодключаемойОбработкиДляИсполненияКодаРедактора(КлючЗначение.Ключ);

		Если ИменаПредустановленныхПеременных <> Неопределено Тогда
			Если ИменаПредустановленныхПеременных.Свойство(КлючЗначение.Ключ) Тогда
				ДанныеРедактораДляСборки.ИменаПредустановленныхПеременных = ИменаПредустановленныхПеременных[КлючЗначение.Ключ];
			КонецЕсли;
		КонецЕсли;

		НужнаСборка	= Истина;

		КэшСборкиОбработкиРедактора = КлючЗначение.Значение.КэшРезультатовПодключенияОбработкиИсполнения; //см. УИ_РедакторКодаКлиентСервер.НовыйКэшРезультатовПодключенияОбработкиИсполнения
		Если КэшСборкиОбработкиРедактора <> Неопределено Тогда
			ВсеПеременныеЕстьВСобраннойОбработке = Истина;
			
			Для Каждого Стр Из ДанныеРедактораДляСборки.ИменаПредустановленныхПеременных Цикл
				Если КэшСборкиОбработкиРедактора.ИменаПредустановленныхПеременных.Найти(НРег(Стр)) = Неопределено Тогда
					ВсеПеременныеЕстьВСобраннойОбработке = Ложь;
					Прервать;
				КонецЕсли;
			КонецЦикла;

			НужнаСборка = ДанныеРедактораДляСборки.ИсполнениеНаКлиенте <> КэшСборкиОбработкиРедактора.ИсполнениеНаКлиенте
						  Или ДанныеРедактораДляСборки.ТекстРедактора <> КэшСборкиОбработкиРедактора.ТекстРедактора
						  Или Не ВсеПеременныеЕстьВСобраннойОбработке;
		КонецЕсли;

		Если Не НужнаСборка Тогда
			Продолжить;
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(ДанныеРедактораДляСборки.ТекстРедактора) Тогда
			Продолжить;
		КонецЕсли;
		
		РедакторыДляСборки.Добавить(ДанныеРедактораДляСборки);

	КонецЦикла;
	
	Если РедакторыДляСборки.Количество() = 0 Тогда
		ВыполнитьОбработкуОповещения(ОписаниеОповещенияОЗавершении, Истина);
		Возврат;
	КонецЕсли;

	ПараметрыСборкиОбработок = НовыйПараметрыСборкиОбработокДляРедакторов();
	ПараметрыСборкиОбработок.Форма = Форма;
	ПараметрыСборкиОбработок.РедакторыДляСборки = УИ_РедакторКодаВызовСервера.РедакторыДляСборкиСПреобразованнымТекстомМодуля(РедакторыДляСборки);
	ПараметрыСборкиОбработок.ОписаниеОповещенияОЗавершении = ОписаниеОповещенияОЗавершении;
	ПараметрыСборкиОбработок.КаталогШаблонаОбработки = УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(УИ_ОбщегоНазначенияКлиент.КаталогВспомогательныхБиблиотекИнструментов(),
																									  "ШаблонОбработки");

	НачатьСохранениеШаблонаОбработкиНаДиск(ПараметрыСборкиОбработок.КаталогШаблонаОбработки,
										   Новый ОписаниеОповещения("НачатьСборкуОбработокДляИсполненияКодаЗавершениеСохраненияШаблонаОбработки",
		ЭтотОбъект, ПараметрыСборкиОбработок));

КонецПроцедуры

#КонецОбласти

#Область СобытияФормыСРедактором

// Форма при открытии.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения - 
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения,Неопределено - Описание оповещения о завершении
Процедура ФормаПриОткрытии(Форма, ОписаниеОповещенияОЗавершении = Неопределено) Экспорт
	Форма.УИ_РедакторКодаКлиентскиеДанные = Новый Структура;
	Форма.УИ_РедакторКодаКлиентскиеДанные.Вставить("События", Новый Массив);
	Форма.УИ_РедакторКодаКлиентскиеДанные.Вставить("ОбработчикиСобытий", Новый Структура);

	ДопПараметры = Новый Структура;
	ДопПараметры.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);
	ДопПараметры.Вставить("Форма", Форма);

#Если ВебКлиент Тогда
	ФормаПриОткрытииЗавершениеПодготовительныхДействий(Форма, ОписаниеОповещенияОЗавершении);
#Иначе
		УИ_ОбщегоНазначенияКлиент.ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкой(Новый ОписаниеОповещения("ФормаПриОткрытииЗавершениеПодключенияРасширенияРаботыСФайлами",
			ЭтотОбъект, ДопПараметры));
#КонецЕсли
КонецПроцедуры

// Поле редактора HTMLДокумент сформирован.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  Элемент - ПолеФормы
Процедура ПолеРедактораHTMLДокументСформирован(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	РедакторыФормы = УИ_РедакторКодаКлиентСервер.РедакторыФормы(Форма);

	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];//см. УИ_РедакторКодаКлиентСервер.НовыйДанныеРедактораФормы
	ПараметрыРедактора.Инициализирован = Истина;
	ПараметрыРедактора.ГотовКИспользованию = Ложь;

	Форма.ПодключитьОбработчикОжидания("Подключаемый_РедакторКодаОтложеннаяИнициализацияРедакторов", 0.2, Истина);
КонецПроцедуры

// Поле редактора HTMLПри нажатии.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  Элемент - ПолеФормы
//  ДанныеСобытия - ФиксированнаяСтруктура
//  СтандартнаяОбработка - Булево -Стандартная обработка
Процедура ПолеРедактораHTMLПриНажатии(Форма, Элемент, ДанныеСобытия, СтандартнаяОбработка) Экспорт
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);
	ВидыРедактора = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();

	Событие = Неопределено;

	Если ВидРедактора = ВидыРедактора.Monaco Тогда
		Событие = СобытиеДляОбработкиПриНажатииMonaco(Форма, Элемент, ДанныеСобытия);
	ИначеЕсли ВидРедактора = ВидыРедактора.Ace Тогда 
		Событие = СобытиеДляОбработкиПриНажатииAce(Форма, Элемент, ДанныеСобытия)
	КонецЕсли;

	Если Событие = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Форма.УИ_РедакторКодаКлиентскиеДанные.События.Добавить(Событие);

	Форма.ПодключитьОбработчикОжидания("Подключаемый_РедакторКодаОтложеннаяОбработкаСобытийРедактора", 0.1, Истина);

КонецПроцедуры

// Отложенная обработка событий редактора.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения 
Процедура ОтложеннаяОбработкаСобытийРедактора(Форма) Экспорт

	Для Каждого ТекущееСобытие Из Форма.УИ_РедакторКодаКлиентскиеДанные.События Цикл
		ДополнительныеПараметры = Новый Структура;
		ДополнительныеПараметры.Вставить("Форма", Форма);
		ДополнительныеПараметры.Вставить("Элемент", ТекущееСобытие.Элемент);

		Если ТекущееСобытие.ИмяСобытия = "EVENT_QUERY_CONSTRUCT" Тогда
			ОткрытьКонструкторЗапросаMonaco(ТекущееСобытие.ДанныеСобытия, ДополнительныеПараметры);
		ИначеЕсли ТекущееСобытие.ИмяСобытия = "EVENT_FORMAT_CONSTRUCT" Тогда
			ОткрытьКонструкторФорматнойСтрокиMonaco(ТекущееСобытие.ДанныеСобытия, ДополнительныеПараметры);
		ИначеЕсли ТекущееСобытие.ИмяСобытия = "EVENT_GET_METADATA" Тогда
			ДополнительныеПараметры.Вставить("ДанныеСобытия", ТекущееСобытие.ДанныеСобытия);

			ИмяМетаданных = ТекущееСобытие.ДанныеСобытия.ИмяМетаданных;
			МассивИменМетаданного = СтрРазделить(ИмяМетаданных, ".");

			Если МассивИменМетаданного[0] = "module" Тогда

				УстановитьОписаниеМодуляДляРедактораMonaco(ИмяМетаданных, ДополнительныеПараметры);

			Иначе

				УстановитьОписаниеМетаданныхДляРедактораMonaco(ИмяМетаданных, ДополнительныеПараметры);

			КонецЕсли;
		ИначеЕсли ТекущееСобытие.ИмяСобытия = "EVENT_CONTENT_CHANGED"
				  Или ТекущееСобытие.ИмяСобытия = "ACE_EVENT_CONTENT_CHANGED" Тогда
			РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
			ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма,
																									   ТекущееСобытие.Элемент);
			СобытияРедактора = РедакторыФормы[ИдентификаторРедактора].СобытияРедактора;

			Если ЗначениеЗаполнено(СобытияРедактора.ПриИзменении) Тогда
				ВыполнитьОбработкуОповещения(Новый ОписаниеОповещения(СобытияРедактора.ПриИзменении, Форма,
					ДополнительныеПараметры), ТекущееСобытие.Элемент);
			КонецЕсли;
		ИначеЕсли ТекущееСобытие.ИмяСобытия = "INSERT_MACRO_COLUMN" Тогда
			ВставитьМакроКолонкуРедактораЗапросаЭлементаФормы(Форма, ТекущееСобытие.Элемент);
		ИначеЕсли ТекущееСобытие.ИмяСобытия = "EVENT_GET_DEFINITION" Тогда
			Если ЗначениеЗаполнено(ТекущееСобытие.ДанныеСобытия.Модуль) Тогда
				ИмяМодуля = "module." + ТекущееСобытие.ДанныеСобытия.Модуль;

				ОткрытыеФормыПросмотраОпределений = УИ_ОбщегоНазначенияКлиент.ФормыПоКлючуУникальности(ВРег(ТекущееСобытие.ДанныеСобытия.Модуль),
																									   "ОбщаяФорма.УИ_ФормаКода");
				Если ОткрытыеФормыПросмотраОпределений.Количество() > 0 Тогда
					ФормаКода = ОткрытыеФормыПросмотраОпределений[0];
					ПерейтиКОпределениюМетодаРедактора(ФормаКода, "Код", ТекущееСобытие.ДанныеСобытия.Слово);
					ФормаКода.Активизировать();
				Иначе

					РедакторыФормы = ДополнительныеПараметры.Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
					ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма,
																											   ТекущееСобытие.Элемент);
					ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];

					ПараметрыОповещения = Новый Структура;
					ПараметрыОповещения.Вставить("ИдентификаторРедактора", ИдентификаторРедактора);
					ПараметрыОповещения.Вставить("Форма", Форма);
					ПараметрыОповещения.Вставить("ТекущееСобытие", ТекущееСобытие);

					НачатьПолучениеТекстаМодуляИзИсходныхФайлов(ИмяМодуля,
																ПараметрыРедактора.ПараметрыРедактора.КаталогиИсходныхФайлов,
																Новый ОписаниеОповещения("ОткрытьОпределениеПроцедурыМодуляЗавершениеПолученияТекстаМодуля",
						ЭтотОбъект, ПараметрыОповещения));
				КонецЕсли;
			КонецЕсли;
		ИначеЕсли ТекущееСобытие.ИмяСобытия = "TOOLS_UI_1C_COPY_TO_CLIPBOARD" Тогда
			ВыделенныйТекст = ВыделенныйТекстРедактораЭлементаФормы(Форма, ТекущееСобытие.Элемент);
			УИ_БуферОбменаКлиент.НачатьКопированиеСтрокиВБуфер(ВыделенныйТекст,
															   Новый ОписаниеОповещения("НачатьКопированиеВыделенногоТекстаВБуферОбменаЗавершение",
				ЭтотОбъект, ДополнительныеПараметры));
		ИначеЕсли ТекущееСобытие.ИмяСобытия = "TOOLS_UI_1C_PASTE_FROM_CLIPBOARD" Тогда
			УИ_БуферОбменаКлиент.НачатьПолучениеСтрокиИзБуфера(Новый ОписаниеОповещения("НачатьВставкуИзБуферОбменаЗавершениеПолученияТекста",
				ЭтотОбъект, ДополнительныеПараметры));
		ИначеЕсли ТекущееСобытие.ИмяСобытия = "COLABORATOR_READY" Тогда 
			НачатьСессиюВзаимодействияРедактораКодаЭлементаФормы(Форма, ТекущееСобытие.Элемент);
		КонецЕсли;
		
	КонецЦикла;

	Форма.УИ_РедакторКодаКлиентскиеДанные.События.Очистить();
КонецПроцедуры

// Выполнить команду редактора кода.
// 
// Параметры:
//  Форма -ФормаКлиентскогоПриложения-Форма
//  Команда -КомандаФормы-Команда
Процедура ВыполнитьКомандуРедактораКода(Форма, Команда) Экспорт
	СтруктураКоманды = УИ_РедакторКодаКлиентСервер.СтруктураИмениКомандыФормы(Команда.Имя);

	РедакторыФормы =  УИ_РедакторКодаКлиентСервер.РедакторыФормы(Форма);
	ПараметрыРедактора = РедакторыФормы[СтруктураКоманды.ИдентификаторРедактора];
	
	Если СтруктураКоманды.ИмяКоманды = УИ_РедакторКодаКлиентСервер.ИмяКомандыРежимВыполненияЧерезОбработку() Тогда
		ПараметрыРедактора.ИспользоватьОбработкуДляВыполненияКода = Не ПараметрыРедактора.ИспользоватьОбработкуДляВыполненияКода;
		Форма.Элементы[Команда.Имя].Пометка = ПараметрыРедактора.ИспользоватьОбработкуДляВыполненияКода;
	ИначеЕсли СтруктураКоманды.ИмяКоманды = УИ_РедакторКодаКлиентСервер.ИмяКомандыПоделитьсяАлгоритмом() Тогда
		ТекстАлгоритма = ТекстКодаРедактора(Форма, СтруктураКоманды.ИдентификаторРедактора);
		ЭтоЗапрос = ПараметрыРедактора.Язык = "bsl_query";

		ПоделитьсяКодом(ТекстАлгоритма, ЭтоЗапрос, Форма);
	ИначеЕсли СтруктураКоманды.ИмяКоманды = УИ_РедакторКодаКлиентСервер.ИмяКомандыЗагрузитьАлгоритм() Тогда
		ПараметрыОповещения = Новый Структура;
		ПараметрыОповещения.Вставить("Форма", Форма);
		ПараметрыОповещения.Вставить("ИдентификаторРедактора", СтруктураКоманды.ИдентификаторРедактора);

		НачатьЗагрузкуКодаИзСервиса(Новый ОписаниеОповещения("НачатьЗагрузкуКодаИзСервисаЗавершение", ЭтотОбъект,
			ПараметрыОповещения));
	ИначеЕсли СтруктураКоманды.ИмяКоманды = УИ_РедакторКодаКлиентСервер.ИмяКомандыКонструкторЗапроса() Тогда
	ИначеЕсли СтруктураКоманды.ИмяКоманды = УИ_РедакторКодаКлиентСервер.ИмяКомандыНачатьСессиюВзаимодействия() Тогда
		 НачатьСессиюВзаимодействияСЗапросомПараметровРедактораКода(Форма, СтруктураКоманды.ИдентификаторРедактора);
	ИначеЕсли СтруктураКоманды.ИмяКоманды = УИ_РедакторКодаКлиентСервер.ИмяКомандыЗакончитьСессиюВзаимодействия() Тогда
		 ЗавершитьСессиюВзаимодействияРедактораКода(Форма, СтруктураКоманды.ИдентификаторРедактора);
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ВзаимодействиеСРедактором

// Установливает текст редактора по элементу формы.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  Элемент - ПолеФормы - Элемент формы редактора
//  Текст - Строка -Новый текст редактора
//  УстанавливатьОригинальныйТекст - Булево - Устанавливать оригинальный текст
Процедура УстановитьТекстРедактораЭлементаФормы(Форма, Элемент, Текст, УстанавливатьОригинальныйТекст = Ложь) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УстановитьТекстРедактора(Форма, ИдентификаторРедактора, Текст, УстанавливатьОригинальныйТекст);
КонецПроцедуры

// Установить текст редактора по идентификатору редактора
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения - Форма
//  ИдентификаторРедактора - Строка - Идентификатор редактора
//  Текст - Строка - Новый текст редактора
//  УстанавливатьОригинальныйТекст - Булево - Устанавливать оригинальный текст
Процедура УстановитьТекстРедактора(Форма, ИдентификаторРедактора, Текст, УстанавливатьОригинальныйТекст = Ложь) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = УИ_РедакторКодаКлиентСервер.РедакторыФормы(Форма);
	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		УстановитьКэшРедактораФормы(ПараметрыРедактора, Текст, ?(УстанавливатьОригинальныйТекст, Текст, Неопределено));
		Возврат;
	КонецЕсли;

	Если Не ПараметрыРедактора.Инициализирован Тогда
		УстановитьКэшРедактораФормы(ПараметрыРедактора, Текст, ?(УстанавливатьОригинальныйТекст, Текст, Неопределено));
		Возврат;
	КонецЕсли;
	
	Если ВидРедактора = ВидыРедакторов.Текст Тогда
		Форма[ПараметрыРедактора.ИмяРеквизита] = Текст;
	ИначеЕсли ВидРедактора = ВидыРедакторов.Ace Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ДокументHTML.editor.setValue(Текст, -1);
	ИначеЕсли ВидРедактора = ВидыРедакторов.Monaco Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ДокументHTML.updateText(Текст);
		Если УстанавливатьОригинальныйТекст Тогда
			ДокументHTML.setOriginalText(Текст);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

// Установливает оригинальный текст редактора по по элементу формы.
// Актуально только для редактора Monaco. 
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  Элемент - ПолеФормы - Элемент формы редактора
//  Текст - Строка - Оригинальный текст редактора
Процедура УстановитьОригинальныйТекстРедактораЭлементаФормы(Форма, Элемент, Текст) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УстановитьОригинальныйТекстРедактора(Форма, ИдентификаторРедактора, Текст);
КонецПроцедуры

// Установливает оригинальный текст редактора по идентификатору редактора.
// Актуально только для редактора Monaco. 
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  ИдентификаторРедактора - Строка -Идентификатор редактора
//  Текст - Строка - Оригинальный текст редактора
Процедура УстановитьОригинальныйТекстРедактора(Форма, ИдентификаторРедактора, Текст) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = УИ_РедакторКодаКлиентСервер.РедакторыФормы(Форма);
	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		УстановитьКэшРедактораФормы(ПараметрыРедактора, , Текст);
		Возврат;
	КонецЕсли;

	Если Не ПараметрыРедактора.Инициализирован Тогда
		УстановитьКэшРедактораФормы(ПараметрыРедактора, , Текст);
		Возврат;
	КонецЕсли;
	
	Если ВидРедактора = ВидыРедакторов.Monaco Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ДокументHTML.setOriginalText(Текст);
	КонецЕсли;
КонецПроцедуры

// Установить оригинальный текст редактора равным текущему.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения- 
//  ИдентификаторРедактора - Строка - Идентификатор редактора
Процедура УстановитьОригинальныйТекстРедактораРавнымТекущему(Форма, ИдентификаторРедактора) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат;
	КонецЕсли;

	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Возврат;
	КонецЕсли;
	
	Если ВидРедактора = ВидыРедакторов.Monaco Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ТекстКода = ДокументHTML.getText();
		ДокументHTML.setOriginalText(ТекстКода);
	КонецЕсли;
КонецПроцедуры

// Возвращает текст кода редактора 
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  ИдентификаторРедактора - Строка - Идентификатор редактора
// 
// Возвращаемое значение:
//  Строка - Текст кода редактора элемента формы
Функция ТекстКодаРедактора(Форма, ИдентификаторРедактора) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Если ПараметрыРедактора.КэшТекстаРедактора <> Неопределено Тогда
			Возврат ПараметрыРедактора.КэшТекстаРедактора.Текст;
		КонецЕсли;
		Возврат "";
	КонецЕсли;
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Если ПараметрыРедактора.КэшТекстаРедактора <> Неопределено Тогда
				
			Возврат ПараметрыРедактора.КэшТекстаРедактора.Текст;
		КонецЕсли;
			
		Возврат "";
	КонецЕсли;

	ТекстКода="";

	Если ВидРедактора = ВидыРедакторов.Текст Тогда
		ТекстКода = Форма[ПараметрыРедактора.ИмяРеквизита];
	ИначеЕсли ВидРедактора = ВидыРедакторов.Ace Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ТекстКода = ДокументHTML.editor.getValue();
	ИначеЕсли ВидРедактора = ВидыРедакторов.Monaco Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ТекстКода = ДокументHTML.getText();
	КонецЕсли;

	Возврат СокрЛП(ТекстКода);
КонецФункции

// Возвращает текст кода редактора по элементу формы редактора
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  Элемент - ПолеФормы - Элемент формы редактора
// 
// Возвращаемое значение:
//  Строка - Текст кода редактора элемента формы
Функция ТекстКодаРедактораЭлементаФормы(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат "";
	КонецЕсли;

	Возврат ТекстКодаРедактора(Форма, ИдентификаторРедактора);
КонецФункции

// Возвращает оригинальный текст кода редактора.
// для редакторов отличных от monaco возвращает пустую строку
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  ИдентификаторРедактора - Строка - Идентификатор редактора
// 
// Возвращаемое значение:
//  Строка
Функция ОригинальныйТекстКодаРедактора(Форма, ИдентификаторРедактора) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];

	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Если Не ПараметрыРедактора.Видимость
			И ПараметрыРедактора.КэшТекстаРедактора <> Неопределено Тогда
				
			Возврат ПараметрыРедактора.КэшТекстаРедактора.ОригинальныйТекст;
		КонецЕсли;
	
		Возврат "";
	КонецЕсли;
	
	Если ВидРедактора = ВидыРедакторов.Monaco Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		Возврат ДокументHTML.getOriginalText();
	Иначе 
		Возврат "";
	КонецЕсли;
	
КонецФункции

// Возвращает оригинальный текст кода редактора.
// для редакторов отличных от monaco возвращает пустую строку
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  Элемент - ПолеФормы - Элемент формы редактора
// 
// Возвращаемое значение:
//  Строка
Функция ОригинальныйТекстКодаРедактораЭлементаФормы(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат "";
	КонецЕсли;

	Возврат ОригинальныйТекстКодаРедактора(Форма, ИдентификаторРедактора);
	
КонецФункции

// Возвращает текущие границы выделения редактора.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  ИдентификаторРедактора - Строка - Идентификатор редактора
// 
// Возвращаемое значение:
//  см. НовыйГраницыВыделения
Функция ГраницыВыделенияРедактора(Форма, ИдентификаторРедактора) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат НовыйГраницыВыделения();
	КонецЕсли;

	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];

	ГраницыВыделения = НовыйГраницыВыделения();
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Возврат ГраницыВыделения;
	КонецЕсли;

	Если ВидРедактора = ВидыРедакторов.Текст Тогда
		ЭлементРедактора = Форма.Элементы[ПараметрыРедактора.ПолеРедактора];
			
		ЭлементРедактора.ПолучитьГраницыВыделения(ГраницыВыделения.НачалоСтроки, ГраницыВыделения.НачалоКолонки,
			ГраницыВыделения.КонецСтроки, ГраницыВыделения.КонецКолонки);		
	ИначеЕсли ВидРедактора = ВидыРедакторов.Ace Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ВыделеннаяОбласть = ДокументHTML.editor.getSelectionRange();
		
		ГраницыВыделения.НачалоСтроки = ВыделеннаяОбласть.start.row;
		ГраницыВыделения.НачалоКолонки = ВыделеннаяОбласть.start.column;
		ГраницыВыделения.КонецСтроки = ВыделеннаяОбласть.end.row;
		ГраницыВыделения.КонецКолонки = ВыделеннаяОбласть.end.column;
	ИначеЕсли ВидРедактора = ВидыРедакторов.Monaco Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		
		Выделение = ДокументHTML.getSelection();
		ГраницыВыделения.НачалоСтроки = Выделение.startLineNumber;
		ГраницыВыделения.НачалоКолонки = Выделение.startColumn;
		ГраницыВыделения.КонецСтроки = Выделение.endLineNumber;
		ГраницыВыделения.КонецКолонки = Выделение.endColumn;
	КонецЕсли;

	Возврат ГраницыВыделения;
	
КонецФункции

// Возвращает текущие границы выделения редактора по элементу формы.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  Элемент - ПолеФормы - Элемент формы редактора
// 
// Возвращаемое значение:
//  см. НовыйГраницыВыделения
Функция ГраницыВыделенияРедактораЭлементаФормы(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат НовыйГраницыВыделения();
	КонецЕсли;
	
	Возврат ГраницыВыделенияРедактора(Форма, ИдентификаторРедактора);	
КонецФункции

// Устанавливает границы выделения для редактора.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  ИдентификаторРедактора - Строка - Идентификатор редактора
//  НачалоСтроки - Число - Начало строки
//  НачалоКолонки - Число - Начало колонки
//  КонецСтроки - Число - Конец строки
//  КонецКолонки - Число - Конец колонки
Процедура УстановитьГраницыВыделения(Форма, ИдентификаторРедактора, НачалоСтроки, НачалоКолонки, КонецСтроки,
	КонецКолонки) Экспорт

	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Возврат;
	КонецЕсли;

	Если ВидРедактора = ВидыРедакторов.Текст Тогда
		ЭлементРедактора = Форма.Элементы[ПараметрыРедактора.ПолеРедактора];
			
		ЭлементРедактора.УстановитьГраницыВыделения(НачалоСтроки, НачалоКолонки, КонецСтроки, КонецКолонки);		
	ИначеЕсли ВидРедактора = ВидыРедакторов.Ace Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ДокументHTML.appTo1C.setSelection(НачалоСтроки, НачалоКолонки, КонецСтроки, КонецКолонки);
	ИначеЕсли ВидРедактора = ВидыРедакторов.Monaco Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ДокументHTML.setSelection(НачалоСтроки, НачалоКолонки, КонецСтроки, КонецКолонки);
	КонецЕсли;

КонецПроцедуры

// Устанавливает границы выделения для редактора по элементу формы
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  Элемент - ПолеФормы - Элемент формы редактора 
//  НачалоСтроки - Число - Начало строки
//  НачалоКолонки - Число - Начало колонки
//  КонецСтроки - Число - Конец строки
//  КонецКолонки - Число - Конец колонки
Процедура УстановитьГраницыВыделенияЭлементаФормы(Форма, Элемент, НачалоСтроки, НачалоКолонки, КонецСтроки,
	КонецКолонки) Экспорт

	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УстановитьГраницыВыделения(Форма, ИдентификаторРедактора, НачалоСтроки, НачалоКолонки, КонецСтроки, КонецКолонки);

КонецПроцедуры

// Вставляет текст по позиции курсора.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  ИдентификаторРедактора - Строка - Идентификатор редактора
//  Текст - Строка - Текст вставки
Процедура ВставитьТекстПоПозицииКурсора(Форма, ИдентификаторРедактора, Текст) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Возврат;
	КонецЕсли;

	Если ВидРедактора = ВидыРедакторов.Текст Тогда
		ЭлементРедактора = Форма.Элементы[ПараметрыРедактора.ПолеРедактора];
		ЭлементРедактора.ВыделенныйТекст = Текст;	
	ИначеЕсли ВидРедактора = ВидыРедакторов.Ace Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ДокументHTML.editor.insert(Текст);
	ИначеЕсли ВидРедактора = ВидыРедакторов.Monaco Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ДокументHTML.selectedText(Текст);
	КонецЕсли;
КонецПроцедуры

// Вставляет текст по позиции курсора по элементу формы.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  Элемент - ПолеФормы - Элемент формы редактора
//  Текст - Строка - Текст вставки
Процедура ВставитьТекстПоПозицииКурсораЭлементаФормы(Форма, Элемент, Текст) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ВставитьТекстПоПозицииКурсора(Форма, ИдентификаторРедактора, Текст);
	
КонецПроцедуры

// Возвращает выделенный текст редактора.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  ИдентификаторРедактора - Строка - Идентификатор редактора
// 
// Возвращаемое значение:
//  Строка - Выделенный текст редактора
Функция ВыделенныйТекстРедактора(Форма, ИдентификаторРедактора) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат "";
	КонецЕсли;
	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Возврат "";
	КонецЕсли;

	ТекстКода="";

	Если ВидРедактора = ВидыРедакторов.Текст Тогда
		ТекстКода = Форма.Элементы[ПараметрыРедактора.ПолеРедактора].ВыделенныйТекст;
	ИначеЕсли ВидРедактора = ВидыРедакторов.Ace Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ТекстКода = ДокументHTML.editor.getCopyText();
	ИначеЕсли ВидРедактора = ВидыРедакторов.Monaco Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ТекстКода = ДокументHTML.selectedText();
	КонецЕсли;

	Возврат СокрЛП(ТекстКода);
	
КонецФункции

// Возвращает выделенный текст редактора элемента формы.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  Элемент - ПолеФормы - Элемент формы редактора
// 
// Возвращаемое значение:
//  Строка - Выделенный текст редактора
Функция ВыделенныйТекстРедактораЭлементаФормы(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат "";
	КонецЕсли;

	Возврат ВыделенныйТекстРедактора(Форма, ИдентификаторРедактора);
	
КонецФункции

// Добавляет комментарии выделенных строк
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  ИдентификаторРедактора - Строка - Идентификатор редактора
Процедура ДобавитьКомментарииСтрокРедактора(Форма, ИдентификаторРедактора) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат;
	КонецЕсли;
	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Возврат;
	КонецЕсли;

	Если ВидРедактора = ВидыРедакторов.Текст Тогда
		ТекстКода = Форма[ПараметрыРедактора.ИмяРеквизита];
		ГраницыВыделения = ГраницыВыделенияРедактора(Форма, ИдентификаторРедактора);

		ДобавитьВТекстДополнениеВНачалеСтрокиПоГраницамВыделения(ТекстКода, ГраницыВыделения, "//");
		Форма[ПараметрыРедактора.ИмяРеквизита] = ТекстКода;
		
		УстановитьГраницыВыделения(Форма, ИдентификаторРедактора, ГраницыВыделения.НачалоСтроки,
			ГраницыВыделения.НачалоКолонки + 2, ГраницыВыделения.КонецСтроки, ГраницыВыделения.КонецКолонки + 2);
	ИначеЕсли ВидРедактора = ВидыРедакторов.Ace Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ТекстКода = ДокументHTML.editor.getValue();
		
		ГраницыВыделения = ГраницыВыделенияРедактора(Форма, ИдентификаторРедактора);
		ГраницыВыделения.НачалоСтроки = ГраницыВыделения.НачалоСтроки + 1;
		ГраницыВыделения.КонецСтроки = ГраницыВыделения.КонецСтроки + 1;
		
		ДобавитьВТекстДополнениеВНачалеСтрокиПоГраницамВыделения(ТекстКода, ГраницыВыделения, "//");
		
		ДокументHTML.editor.setValue(ТекстКода, -1);
		УстановитьГраницыВыделения(Форма, ИдентификаторРедактора, ГраницыВыделения.НачалоСтроки-1,
			ГраницыВыделения.НачалоКолонки + 2, ГраницыВыделения.КонецСтроки-1, ГраницыВыделения.КонецКолонки + 2);
	ИначеЕсли ВидРедактора = ВидыРедакторов.Monaco Тогда
		ГраницыВыделения = ГраницыВыделенияРедактора(Форма, ИдентификаторРедактора);
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ТекстКода = ДокументHTML.addComment();
				
		УстановитьГраницыВыделения(Форма, ИдентификаторРедактора, ГраницыВыделения.НачалоСтроки,
			ГраницыВыделения.НачалоКолонки + 2, ГраницыВыделения.КонецСтроки, ГраницыВыделения.КонецКолонки + 2);
		
	КонецЕсли;
	
КонецПроцедуры

// Добавляет комментарии выделенных строк элемента редактора
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  Элемент - ПолеФормы - Элемент формы редактора
Процедура ДобавитьКомментарииСтрокРедактораЭлементаФормы(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ДобавитьКомментарииСтрокРедактора(Форма, ИдентификаторРедактора);
КонецПроцедуры

// Удаляет комментарии выделенных строк
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  ИдентификаторРедактора - Строка - Идентификатор редактора
Процедура УдалитьКомментарииСтрокРедактора(Форма, ИдентификаторРедактора) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат;
	КонецЕсли;
	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Возврат;
	КонецЕсли;

	Если ВидРедактора = ВидыРедакторов.Текст Тогда
		ТекстКода = Форма[ПараметрыРедактора.ИмяРеквизита];
		ГраницыВыделения = ГраницыВыделенияРедактора(Форма, ИдентификаторРедактора);

		УдалитьТекстДополнениеВНачалеСтрокиПоГраницамВыделения(ТекстКода, ГраницыВыделения, "//");
		Форма[ПараметрыРедактора.ИмяРеквизита] = ТекстКода;
		
		УстановитьГраницыВыделения(Форма, ИдентификаторРедактора, ГраницыВыделения.НачалоСтроки,
			ГраницыВыделения.НачалоКолонки + 2, ГраницыВыделения.КонецСтроки, ГраницыВыделения.КонецКолонки + 2);
	ИначеЕсли ВидРедактора = ВидыРедакторов.Ace Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ТекстКода = ДокументHTML.editor.getValue();
		
		ГраницыВыделения = ГраницыВыделенияРедактора(Форма, ИдентификаторРедактора);
		ГраницыВыделения.НачалоСтроки = ГраницыВыделения.НачалоСтроки + 1;
		ГраницыВыделения.КонецСтроки = ГраницыВыделения.КонецСтроки + 1;
		
		УдалитьТекстДополнениеВНачалеСтрокиПоГраницамВыделения(ТекстКода, ГраницыВыделения, "//");
		
		ДокументHTML.editor.setValue(ТекстКода, -1);
		УстановитьГраницыВыделения(Форма, ИдентификаторРедактора, ГраницыВыделения.НачалоСтроки-1,
			ГраницыВыделения.НачалоКолонки + 2, ГраницыВыделения.КонецСтроки-1, ГраницыВыделения.КонецКолонки + 2);
	ИначеЕсли ВидРедактора = ВидыРедакторов.Monaco Тогда
		ГраницыВыделения = ГраницыВыделенияРедактора(Форма, ИдентификаторРедактора);
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ТекстКода = ДокументHTML.removeComment();
				
		УстановитьГраницыВыделения(Форма, ИдентификаторРедактора, ГраницыВыделения.НачалоСтроки,
			ГраницыВыделения.НачалоКолонки + 2, ГраницыВыделения.КонецСтроки, ГраницыВыделения.КонецКолонки + 2);
		
	КонецЕсли;
	
КонецПроцедуры

// Удаляет комментарии выделенных строк
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  Элемент - ПолеФормы - Элемент формы редактора
Процедура УдалитьКомментарииСтрокРедактораЭлементаФормы(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УдалитьКомментарииСтрокРедактора(Форма, ИдентификаторРедактора);
КонецПроцедуры

// Добавляет перенос строк редактора.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  ИдентификаторРедактора - Строка - Идентификатор редактора
Процедура ДобавитьПереносСтрокРедактора(Форма, ИдентификаторРедактора) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат;
	КонецЕсли;
	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Возврат;
	КонецЕсли;

	Если ВидРедактора = ВидыРедакторов.Текст Тогда
		ТекстКода = Форма[ПараметрыРедактора.ИмяРеквизита];
		ГраницыВыделения = ГраницыВыделенияРедактора(Форма, ИдентификаторРедактора);

		ДобавитьВТекстДополнениеВНачалеСтрокиПоГраницамВыделения(ТекстКода, ГраницыВыделения, "|");
		Форма[ПараметрыРедактора.ИмяРеквизита] = ТекстКода;
		
		УстановитьГраницыВыделения(Форма, ИдентификаторРедактора, ГраницыВыделения.НачалоСтроки,
			ГраницыВыделения.НачалоКолонки + 2, ГраницыВыделения.КонецСтроки, ГраницыВыделения.КонецКолонки + 2);
	ИначеЕсли ВидРедактора = ВидыРедакторов.Ace Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ТекстКода = ДокументHTML.editor.getValue();
		
		ГраницыВыделения = ГраницыВыделенияРедактора(Форма, ИдентификаторРедактора);
		ГраницыВыделения.НачалоСтроки = ГраницыВыделения.НачалоСтроки + 1;
		ГраницыВыделения.КонецСтроки = ГраницыВыделения.КонецСтроки + 1;
		
		ДобавитьВТекстДополнениеВНачалеСтрокиПоГраницамВыделения(ТекстКода, ГраницыВыделения, "|");
		
		ДокументHTML.editor.setValue(ТекстКода, -1);
		УстановитьГраницыВыделения(Форма, ИдентификаторРедактора, ГраницыВыделения.НачалоСтроки-1,
			ГраницыВыделения.НачалоКолонки + 2, ГраницыВыделения.КонецСтроки-1, ГраницыВыделения.КонецКолонки + 2);
	ИначеЕсли ВидРедактора = ВидыРедакторов.Monaco Тогда
		ГраницыВыделения = ГраницыВыделенияРедактора(Форма, ИдентификаторРедактора);
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ТекстКода = ДокументHTML.addWordWrap();
				
		УстановитьГраницыВыделения(Форма, ИдентификаторРедактора, ГраницыВыделения.НачалоСтроки,
			ГраницыВыделения.НачалоКолонки + 2, ГраницыВыделения.КонецСтроки, ГраницыВыделения.КонецКолонки + 2);
		
	КонецЕсли;
	
КонецПроцедуры

// Добавляет перенос строк редактора элемента формы
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  Элемент - ПолеФормы - Элемент формы редактора
Процедура ДобавитьПереносСтрокРедактораЭлементаФормы(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ДобавитьПереносСтрокРедактора(Форма, ИдентификаторРедактора);
КонецПроцедуры

// Удаляет перенос строк редактора.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  ИдентификаторРедактора - Строка - Идентификатор редактора
Процедура УдалитьПереносСтрокРедактора(Форма, ИдентификаторРедактора) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат;
	КонецЕсли;
	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Возврат;
	КонецЕсли;

	Если ВидРедактора = ВидыРедакторов.Текст Тогда
		ТекстКода = Форма[ПараметрыРедактора.ИмяРеквизита];
		ГраницыВыделения = ГраницыВыделенияРедактора(Форма, ИдентификаторРедактора);

		УдалитьТекстДополнениеВНачалеСтрокиПоГраницамВыделения(ТекстКода, ГраницыВыделения, "|");
		Форма[ПараметрыРедактора.ИмяРеквизита] = ТекстКода;
		
		УстановитьГраницыВыделения(Форма, ИдентификаторРедактора, ГраницыВыделения.НачалоСтроки,
			ГраницыВыделения.НачалоКолонки + 2, ГраницыВыделения.КонецСтроки, ГраницыВыделения.КонецКолонки + 2);
	ИначеЕсли ВидРедактора = ВидыРедакторов.Ace Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ТекстКода = ДокументHTML.editor.getValue();
		
		ГраницыВыделения = ГраницыВыделенияРедактора(Форма, ИдентификаторРедактора);
		ГраницыВыделения.НачалоСтроки = ГраницыВыделения.НачалоСтроки + 1;
		ГраницыВыделения.КонецСтроки = ГраницыВыделения.КонецСтроки + 1;
		
		УдалитьТекстДополнениеВНачалеСтрокиПоГраницамВыделения(ТекстКода, ГраницыВыделения, "|");
		
		ДокументHTML.editor.setValue(ТекстКода, -1);
		УстановитьГраницыВыделения(Форма, ИдентификаторРедактора, ГраницыВыделения.НачалоСтроки-1,
			ГраницыВыделения.НачалоКолонки + 2, ГраницыВыделения.КонецСтроки-1, ГраницыВыделения.КонецКолонки + 2);
	ИначеЕсли ВидРедактора = ВидыРедакторов.Monaco Тогда
		ГраницыВыделения = ГраницыВыделенияРедактора(Форма, ИдентификаторРедактора);
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ТекстКода = ДокументHTML.removeWordWrap();
				
		УстановитьГраницыВыделения(Форма, ИдентификаторРедактора, ГраницыВыделения.НачалоСтроки,
			ГраницыВыделения.НачалоКолонки + 2, ГраницыВыделения.КонецСтроки, ГраницыВыделения.КонецКолонки + 2);
		
	КонецЕсли;
	
КонецПроцедуры

// Удаляет перенос строк редактора элемента формы
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  Элемент - ПолеФормы - Элемент формы редактора
Процедура УдалитьПереносСтрокРедактораЭлементаФормы(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УдалитьПереносСтрокРедактора(Форма, ИдентификаторРедактора);
КонецПроцедуры

// Устанавливает новую видимость для редактора кода по идентификатору редактора
// Если передан параметр "НоваяВидимость", то устанавливается заданная видимость.
// Если параметр "НоваяВидимость" не указан, происходит переключение видимости редактора
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  ИдентификаторРедактора - Строка - Идентификатор редактора
//  НоваяВидимость -  Булево - Новая видимость элемента редактора. Необязательный. 
Процедура ПереключитьВидимостьРедактора(Форма, ИдентификаторРедактора, НоваяВидимость = Неопределено) Экспорт
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	
	Видимость = НоваяВидимость;
	Если Видимость = Неопределено Тогда
		Видимость = Не ПараметрыРедактора.Видимость;
	КонецЕсли;
	Если Не Видимость Тогда
		УстановитьКэшРедактораФормы(ПараметрыРедактора,
									ТекстКодаРедактора(Форма, ИдентификаторРедактора),
									ОригинальныйТекстКодаРедактора(Форма, ИдентификаторРедактора));
	КонецЕсли;
	
	ПараметрыРедактора.Видимость = Видимость;

	Если Не Видимость И УИ_РедакторКодаКлиентСервер.РедакторКодаИспользуетПолеHTML(ВидРедактора) Тогда
		ПараметрыРедактора.Инициализирован = Ложь;
	КонецЕсли;
	
	
	Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Видимость = ПараметрыРедактора.Видимость;
	
КонецПроцедуры

// Устанавливает новую видимость для редактора кода по элементу формы редактора
// Если передан параметр "НоваяВидимость", то устанавливается заданная видимость.
// Если параметр "НоваяВидимость" не указан, происходит переключение видимости редактора
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  Элемент - ПолеФормы - Элемент формы редактора
//  НоваяВидимость -  Булево - Новая видимость элемента редактора. Необязательный. 
Процедура ПереключитьВидимостьРедактораЭлементаФормы(Форма, Элемент, НоваяВидимость = Неопределено) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПереключитьВидимостьРедактора(Форма, ИдентификаторРедактора, НоваяВидимость);
	
КонецПроцедуры

// Получить режим только просмотр редактора.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения-
//  ИдентификаторРедактора - Строка - Идентификатор редактора
// 
// Возвращаемое значение:
// Булево 
Функция РежимТолькоПросмотрРедактора(Форма, ИдентификаторРедактора) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];

	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Если Не ПараметрыРедактора.Видимость Тогда
				
			Возврат ПараметрыРедактора.ТолькоПросмотр;
		КонецЕсли;
	
		Возврат Ложь;
	КонецЕсли;

	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Если ВидРедактора = ВидыРедакторов.Monaco Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		Возврат ДокументHTML.getReadOnly();
	ИначеЕсли ВидРедактора = ВидыРедакторов.Ace Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		Возврат ДокументHTML.editor.getOption("readOnly");
	Иначе 
		Возврат Форма.Элементы[ПараметрыРедактора.ПолеРедактора].ТолькоПросмотр;
	КонецЕсли;
	
	
КонецФункции

// Получить режим только просмотр редактора.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения-
//  Элемент - ПолеФормы -
// 
// Возвращаемое значение:
// Булево 
Функция РежимТолькоПросмотрРедактораЭлементаФормы(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;

	Возврат РежимТолькоПросмотрРедактора(Форма, ИдентификаторРедактора);
КонецФункции

// Установить режим только просмотр редактора.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  ИдентификаторРедактора - Строка - Идентификатор редактора
//  Режим - Булево -
Процедура УстановитьРежимТолькоПросмотрРедактора(Форма, ИдентификаторРедактора, Режим) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];

	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	ПараметрыРедактора.ТолькоПросмотр = Режим;

	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат;
	КонецЕсли;
	
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Возврат;
	КонецЕсли;
	
	Если Не ПараметрыРедактора.Видимость Тогда
		Возврат;
	КонецЕсли;
	
	Если ВидРедактора = ВидыРедакторов.Monaco Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ДокументHTML.setReadOnly(Режим);
	ИначеЕсли ВидРедактора = ВидыРедакторов.Ace Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ДокументHTML.editor.setOption("readOnly", Режим);
	Иначе 
		Форма.Элементы[ПараметрыРедактора.ПолеРедактора].ТолькоПросмотр = Режим;
	КонецЕсли;
	
КонецПроцедуры

// Установить режим только просмотр редактора элемента формы.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  Элемент - ПолеФормы
//  Режим - Булево -
Процедура УстановитьРежимТолькоПросмотрРедактораЭлементаФормы(Форма, Элемент, Режим) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УстановитьРежимТолькоПросмотрРедактора(Форма, ИдентификаторРедактора, Режим);
КонецПроцедуры

// Перейти к определению метода редактора.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  ИдентификаторРедактора - Строка - Идентификатор редактора
//  ИмяМетода - Строка -Имя метода
Процедура ПерейтиКОпределениюМетодаРедактора(Форма, ИдентификаторРедактора, ИмяМетода) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];

	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];

	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат;
	КонецЕсли;
	
	Если Не ПараметрыРедактора.Инициализирован Или Не ПараметрыРедактора.Видимость Тогда
		Возврат;
	КонецЕсли;

	Если ВидРедактора = ВидыРедакторов.Monaco Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
		ДокументHTML.goToFuncDefinition(ИмяМетода);
		
//	ИначеЕсли ВидРедактора = ВидыРедакторов.Ace Тогда
//		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
//		ДокументHTML.editor.setOption("readOnly", Режим);
	КонецЕсли;
	
	
КонецПроцедуры

// Перейти к определению метода редактора элемента формы.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  Элемент - ПолеФормы
//  ИмяМетода - Строка -Имя метода
Процедура ПерейтиКОпределениюМетодаРедактораЭлементаФормы(Форма, Элемент, ИмяМетода) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПерейтиКОпределениюМетодаРедактора(Форма, ИдентификаторРедактора, ИмяМетода);
	
КонецПроцедуры

// Режим использования обработки для выполнения кода редактора.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  ИдентификаторРедактора - Строка - Идентификатор редактора
// 
// Возвращаемое значение:
//  Булево
Функция РежимИспользованияОбработкиДляВыполненияКодаРедактора(Форма, ИдентификаторРедактора) Экспорт
	РедакторыФормы = УИ_РедакторКодаКлиентСервер.РедакторыФормы(Форма);
	
	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	
	Возврат ПараметрыРедактора.ИспользоватьОбработкуДляВыполненияКода;
КонецФункции

// Режим использования обработки для выполнения кода редактора.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  Элемент - ПолеФормы
// 
// Возвращаемое значение:
//  Булево
Функция РежимИспользованияОбработкиДляВыполненияКодаРедактораЭлементаФормы(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;

	Возврат РежимИспользованияОбработкиДляВыполненияКодаРедактора(Форма, ИдентификаторРедактора);
КонецФункции

// Установить режим использования обработки для выполнения кода редактора.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  ИдентификаторРедактора - Строка - Идентификатор редактора
//  Режим - Булево -
Процедура УстановитьРежимИспользованияОбработкиДляВыполненияКодаРедактора(Форма, ИдентификаторРедактора, Режим) Экспорт
	РедакторыФормы = УИ_РедакторКодаКлиентСервер.РедакторыФормы(Форма);
	
	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	ПараметрыРедактора.ИспользоватьОбработкуДляВыполненияКода = Режим;

	ИмяКнопки = УИ_РедакторКодаКлиентСервер.ИмяКнопкиКоманднойПанели(УИ_РедакторКодаКлиентСервер.ИмяКомандыРежимВыполненияЧерезОбработку(),
																			  ИдентификаторРедактора);
																			  
	Форма.Элементы[ИмяКнопки].Пометка = Режим;

КонецПроцедуры

// Установить режим использования обработки для выполнения кода редактора элемента формы.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  Элемент - ПолеФормы
//  Режим - Булево -
Процедура УстановитьРежимИспользованияОбработкиДляВыполненияКодаРедактораЭлементаФормы(Форма, Элемент, Режим) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УстановитьРежимИспользованияОбработкиДляВыполненияКодаРедактора(Форма, ИдентификаторРедактора, Режим);
КонецПроцедуры

// Начать сессию взаимодействия редактора кода.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения- Форма
//  ИдентификаторРедактора -Строка -Идентификатор редактора
Процедура НачатьСессиюВзаимодействияРедактораКода(Форма, ИдентификаторРедактора) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	Если ВидРедактора = ВидыРедакторов.Текст Тогда
		Возврат;
	КонецЕсли;
	
	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат;
	КонецЕсли;

	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора]; //см. УИ_РедакторКодаКлиентСервер.НовыйДанныеРедактораФормы
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Возврат;
	КонецЕсли;
	
	Если ВидРедактора <> ВидыРедакторов.Ace Тогда
		ВозвраТ;
	КонецЕсли;

	ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
	
	Если Не КПолюHTMLРедактораПодключенСкриптВзаимодействия(ДокументHTML) Тогда
		ПодключитьКПолюHTMLСкриптВзаимодействия(Форма, ПараметрыРедактора, ДокументHTML);	
		Возврат;			
	КонецЕсли;
	
	ПараметрыСессии = ПараметрыРедактора.ПараметрыСессииВзаимодействия;
	Если ПараметрыСессии = Неопределено Тогда
		ПараметрыСессии = УИ_РедакторКодаКлиентСервер.НовыйПараметрыСессииВзаимодействия();
		ПараметрыРедактора.ПараметрыСессииВзаимодействия = ПараметрыСессии;
	КонецЕсли;

	Если Не ЗначениеЗаполнено(ПараметрыСессии.Идентификатор) Тогда
		ПараметрыСессии.Идентификатор = Формат(ТекущаяУниверсальнаяДатаВМиллисекундах(), "ЧГ=0;")
										+ Форма.УникальныйИдентификатор;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ПараметрыСессии.ИмяПользователя) Тогда
		ДокументHTML.colaborator.setUserName(ПараметрыСессии.ИмяПользователя);
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ПараметрыСессии.URLВзаимодействия) Тогда
		ДокументHTML.colaborator.setColaborationUrl(ПараметрыСессии.URLВзаимодействия);
	КонецЕсли;

	Если ВидРедактора = ВидыРедакторов.Ace Тогда
		ДокументHTML.colaborator.start(ПараметрыСессии.Идентификатор);
	ИначеЕсли ВидРедактора = ВидыРедакторов.Monaco Тогда
//		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
//		ДокументHTML.updateText(Текст);
//		Если УстанавливатьОригинальныйТекст Тогда
//			ДокументHTML.setOriginalText(Текст);
//		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

// Начать сессию взаимодействия редактора кода элемента формы.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  Элемент - ПолеФормы - Элемент формы редактора
Процедура НачатьСессиюВзаимодействияРедактораКодаЭлементаФормы(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	НачатьСессиюВзаимодействияРедактораКода(Форма, ИдентификаторРедактора);
КонецПроцедуры

// Завершить сессию взаимодействия редактора кода.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  ИдентификаторРедактора -Строка -Идентификатор редактора
Процедура ЗавершитьСессиюВзаимодействияРедактораКода(Форма, ИдентификаторРедактора) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	Если ВидРедактора = ВидыРедакторов.Текст Тогда
		Возврат;
	КонецЕсли;
	
	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат;
	КонецЕсли;

	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Возврат;
	КонецЕсли;
	
	Если ВидРедактора <> ВидыРедакторов.Ace Тогда
		ВозвраТ;
	КонецЕсли;

	ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
	
	Если Не КПолюHTMLРедактораПодключенСкриптВзаимодействия(ДокументHTML) Тогда
		Возврат;			
	КонецЕсли;

	Если ВидРедактора = ВидыРедакторов.Ace Тогда
		ДокументHTML.colaborator.close();
	ИначеЕсли ВидРедактора = ВидыРедакторов.Monaco Тогда
//		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;
//		ДокументHTML.updateText(Текст);
//		Если УстанавливатьОригинальныйТекст Тогда
//			ДокументHTML.setOriginalText(Текст);
//		КонецЕсли;
	КонецЕсли;
	
	
КонецПроцедуры

// Завершить сессию взаимодействия редактора кода элемента формы.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  Элемент - ПолеФормы - Элемент формы редактора
Процедура ЗавершитьСессиюВзаимодействияРедактораКодаЭлементаФормы(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ЗавершитьСессиюВзаимодействияРедактораКода(Форма, ИдентификаторРедактора);
	
КонецПроцедуры

// Установить язык редактора кода.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  ИдентификаторРедактора -Строка-Идентификатор редактора
//  Язык -Строка -Язык
Процедура УстановитьЯзыкРедактораКода(Форма, ИдентификаторРедактора, Язык) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	Если ВидРедактора = ВидыРедакторов.Текст Тогда
		Возврат;
	КонецЕсли;
	
	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат;
	КонецЕсли;

	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Возврат;
	КонецЕсли;
	
	Если ВидРедактора <> ВидыРедакторов.Ace Тогда
		ВозвраТ;
	КонецЕсли;

	ДокументView=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;

	ПараметрыРедактора.Язык = Язык;
	Если ВидРедактора = ВидыРедакторов.Ace Тогда
		ТекЯзык = Язык;
		Если ТекЯзык = "bsl" Тогда
			ТекЯзык="_1c";
		КонецЕсли;
		
		ДокументView.appTo1C.setMode(ТекЯзык);
	ИначеЕсли ВидРедактора = ВидыРедакторов.Monaco Тогда
		ДокументView.setLanguageMode(Язык);
	КонецЕсли;
	
КонецПроцедуры

// Установить язык редактора кода элемента формы.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  Элемент - ПолеФормы - Элемент формы редактора
//  Язык - Строка
Процедура УстановитьЯзыкРедактораКодаЭлементаФормы(Форма, Элемент, Язык) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УстановитьЯзыкРедактораКода(Форма, ИдентификаторРедактора, Язык);
КонецПроцедуры

#КонецОбласти

// Преобразовать текст запроса из выражения встроенного языка редактора кода.
// 
// Параметры:
//  Форма -ФормаКлиентскогоПриложения-Форма
//  ИдентификаторРедактора -Строка-Идентификатор редактора
Процедура ПреобразоватьТекстЗапросаИзВыраженияВстроенногоЯзыкаРедактораКода(Форма, ИдентификаторРедактора) Экспорт
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("Форма", Форма);
	ПараметрыОповещения.Вставить("ИдентификаторРедактора", ИдентификаторРедактора);
	
	ТекстРедактора = ТекстКодаРедактора(Форма, ИдентификаторРедактора);
	
	НезначащиеСимволы = Новый Массив;
	НезначащиеСимволы.Добавить(" ");
	НезначащиеСимволы.Добавить(Символы.НПП);
	НезначащиеСимволы.Добавить(Символы.Таб);
	НезначащиеСимволы.Добавить("|");

	ТекстовыйДокументРедактора = Новый ТекстовыйДокумент();
	ТекстовыйДокументРедактора.УстановитьТекст(ТекстРедактора);

	НашлиНачало = Ложь;
	НомерПоследнейЗначащейСтроки = 0;
	Для НомерСтроки =1 По ТекстовыйДокументРедактора.КоличествоСтрок() Цикл
		ТекСтрокаКода = ТекстовыйДокументРедактора.ПолучитьСтроку(НомерСтроки);
		
		Для Каждого ТекСимвол Из НезначащиеСимволы Цикл
			Пока СтрНачинаетсяС(ТекСтрокаКода, ТекСимвол) Цикл
				ТекСтрокаКода = Сред(ТекСтрокаКода,2);				
			КонецЦикла;
		КонецЦикла;

		Если НашлиНачало Тогда
			ТекСтрокаКода = СтрЗаменить(ТекСтрокаКода, """""", """");
		КонецЕсли;

		Если СтрНачинаетсяС(ТекСтрокаКода, """") Тогда
			ТекСтрокаКода = Сред(ТекСтрокаКода, 2);
		КонецЕсли;

		ТекстовыйДокументРедактора.ЗаменитьСтроку(НомерСтроки,ТекСтрокаКода);	
		Если Не ЗначениеЗаполнено(ТекСтрокаКода) И Не НашлиНачало Тогда
			Продолжить;
		КонецЕсли;
		
		НашлиНачало = Истина;

		Если ЗначениеЗаполнено(ТекСтрокаКода) Тогда
			НомерПоследнейЗначащейСтроки = НомерСтроки;
		КонецЕсли;
	КонецЦикла;
	
	Если НомерПоследнейЗначащейСтроки > 0 Тогда
		ТекСтрокаКода = ТекстовыйДокументРедактора.ПолучитьСтроку(НомерПоследнейЗначащейСтроки);
		Если СтрЗаканчиваетсяНа(ТекСтрокаКода, """;") Тогда
			ТекСтрокаКода = Лев(ТекСтрокаКода, СтрДлина(ТекСтрокаКода) - 2);
		ИначеЕсли СтрЗаканчиваетсяНа(ТекСтрокаКода, """") Или СтрЗаканчиваетсяНа(ТекСтрокаКода, ";") Тогда
			ТекСтрокаКода = Лев(ТекСтрокаКода, СтрДлина(ТекСтрокаКода) - 1);
		КонецЕсли;
		
		ТекстовыйДокументРедактора.ЗаменитьСтроку(НомерПоследнейЗначащейСтроки,ТекСтрокаКода);	
			
	КонецЕсли;
	
	УстановитьТекстРедактора(Форма, ИдентификаторРедактора, ТекстовыйДокументРедактора.ПолучитьТекст());
КонецПроцедуры

// Преобразовать текст запроса из выражения встроенного языка редактора кода.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  Элемент - ПолеФормы - Элемент формы редактора
Процедура ПреобразоватьТекстЗапросаИзВыраженияВстроенногоЯзыкаРедактораЭлементаФормы(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПреобразоватьТекстЗапросаИзВыраженияВстроенногоЯзыкаРедактораКода(Форма, ИдентификаторРедактора);

КонецПроцедуры

// Начать сессию взаимодействия с запросом параметров.
// 
// Параметры:
//  Форма -ФормаКлиентскогоПриложения-Форма
//  ИдентификаторРедактора -Строка-Идентификатор редактора
Процедура НачатьСессиюВзаимодействияСЗапросомПараметровРедактораКода(Форма, ИдентификаторРедактора) Экспорт
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("Форма", Форма);
	ПараметрыОповещения.Вставить("ИдентификаторРедактора", ИдентификаторРедактора);

	ПараметрыФормы = Новый Структура;

	ОткрытьФорму("ОбщаяФорма.УИ_ПараметрыСессииВзаимодействияРедактораКода",
				 ПараметрыФормы,
				 Форма,
				 "" + Форма.УникальныйИдентификатор + ИдентификаторРедактора,
				 ,
				 ,
				 Новый ОписаниеОповещения("НачатьСессиюВзаимодействияСЗапросомПараметровРедактораКодаЗавершениеВводаПараметров",
		ЭтотОбъект, ПараметрыОповещения),
				 РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

// Начать сессию взаимодействия с запросом параметров редактора элемента формы.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -
//  Элемент - ПолеФормы - Элемент формы редактора
Процедура НачатьСессиюВзаимодействияСЗапросомПараметровРедактораЭлементаФормы(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	НачатьСессиюВзаимодействияСЗапросомПараметровРедактораКода(Форма, ИдентификаторРедактора);
	
КонецПроцедуры

Процедура ДобавитьКонтекстРедактораКода(Форма, ИдентификаторРедактора, ДобавляемыйКонтекст) Экспорт
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	РедакторыФормы =  Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	Если Не РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора) Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	Если Не ПараметрыРедактора.Инициализирован Тогда
		Возврат;
	КонецЕсли;

	Если ВидРедактора = ВидыРедакторов.Monaco Тогда
		ДокументHTML=Форма.Элементы[ПараметрыРедактора.ПолеРедактора].Документ.defaultView;

		СоответствиеТипов = СоответствиеСсылочныхТиповКонфигурации();

		ОбъектыДобавления = Новый Структура;
		
		ЗаполнитьСтруктуруКонтекстаРедактораКодаMonaco(ОбъектыДобавления, ДобавляемыйКонтекст, СоответствиеТипов);

		ДокументHTML.updateMetadata(УИ_ОбщегоНазначенияКлиентСервер.мЗаписатьJSON(Новый Структура("customObjects",
			ОбъектыДобавления)));
	КонецЕсли;
КонецПроцедуры

Процедура ОткрытьКонструкторЗапроса(ТекстЗапроса, ОписаниеОповещенияОЗавершении, РежимКомпоновки = Ложь) Экспорт
#Если Не МобильныйКлиент Тогда
	Конструктор=Новый КонструкторЗапроса;
	Если УИ_ОбщегоНазначенияКлиентСервер.ВерсияПлатформыНеМладше_8_3_14() Тогда
		Конструктор.РежимКомпоновкиДанных=РежимКомпоновки;
	КонецЕсли;

	Если ЗначениеЗаполнено(СокрЛП(ТекстЗапроса)) Тогда
		Попытка
			Конструктор.Текст=ТекстЗапроса;
		Исключение
			Сообщить(ОписаниеОшибки());
			Возврат;
		КонецПопытки;
	КонецЕсли;

	Конструктор.Показать(ОписаниеОповещенияОЗавершении);
#КонецЕсли
КонецПроцедуры

Процедура ОткрытьКонструкторФорматнойСтроки(ФорматнаяСтрока, ОписаниеОповещенияОЗавершении) Экспорт
	Конструктор = Новый КонструкторФорматнойСтроки;
	Попытка
		Конструктор.Текст = ФорматнаяСтрока;
	Исключение
		Инфо = ИнформацияОбОшибке();
		ПоказатьПредупреждение( , "Ошибка в тексте форматной строки:" + Символы.ПС + Инфо.Причина.Описание);
		Возврат;
	КонецПопытки;
	Конструктор.Показать(ОписаниеОповещенияОЗавершении);
КонецПроцедуры

Процедура СохранитьМодулиКонфигурацииВФайлы(ОписаниеОповещенияОЗавершении, ТекущиеКаталоги) Экспорт
	ДопПараметрыОповещения = Новый Структура;
	ДопПараметрыОповещения.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);
	ДопПараметрыОповещения.Вставить("ТекущиеКаталоги", ТекущиеКаталоги);

	УИ_ОбщегоНазначенияКлиент.ПодключитьРасширениеРаботыСФайламиСВозможнойУстановкой(
		Новый ОписаниеОповещения("СохранитьМодулиКонфигурацииВФайлыЗавершениеПодключенияРасширенияРаботыСФайлами",
		ЭтотОбъект, ДопПараметрыОповещения));

КонецПроцедуры

Процедура ВставитьМакроКолонкуРедактораЗапроса(Форма, ИдентификаторРедактора) Экспорт
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("Форма", Форма);
	ПараметрыОповещения.Вставить("ИдентификаторРедактора", ИдентификаторРедактора);
	
	ВыделенныйТекст = ВыделенныйТекстРедактора(Форма, ИдентификаторРедактора);
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("КолонкаЗапроса", ВыделенныйТекст);
	ОткрытьФорму("Обработка.УИ_КонсольЗапросов.Форма.ВыборМакроКолонки", ПараметрыФормы, Форма, , , ,
		Новый ОписаниеОповещения("ВставитьМакроКолонкуРедактораЗапросаЗавершение", ЭтотОбъект, ПараметрыОповещения),
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

Процедура ВставитьМакроКолонкуРедактораЗапросаЭлементаФормы(Форма, Элемент) Экспорт
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(Форма, Элемент);
	Если ИдентификаторРедактора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ВставитьМакроКолонкуРедактораЗапроса(Форма, ИдентификаторРедактора);
	
КонецПроцедуры

// Поделиться кодом.
// 
// Параметры:
//  Код -Строка-Код
//  ЭтоЗапрос -Булево-Это запрос
//  ВладелецФормы - ФормаКлиентскогоПриложения -
Процедура ПоделитьсяКодом(Код, ЭтоЗапрос, ВладелецФормы = Неопределено) Экспорт
	СсылкаНаКод = УИ_РедакторКодаВызовСервера.СсылкаНаКодВСервисеПослеЗагрузки(Код, ЭтоЗапрос);
	Если Не ЗначениеЗаполнено(СсылкаНаКод) Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Ссылка", СсылкаНаКод);
	ОткрытьФорму("ОбщаяФорма.УИ_ФормаСсылкиНаКод",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 ,
				 РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

// Начать загрузку кода из сервиса.
// 
// Параметры:
//  ОписаниеОповещения - ОписаниеОповещения -  Описание оповещения
Процедура НачатьЗагрузкуКодаИзСервиса(ОписаниеОповещения, ВладелецФормы = Неопределено) Экспорт
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("ОповещениеОЗавершении", ОписаниеОповещения);

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("РежимВставки", Истина);
	
	ОткрытьФорму("ОбщаяФорма.УИ_ФормаСсылкиНаКод",
				 ПараметрыФормы,
				 ВладелецФормы,
				 ,
				 ,
				 ,
				 Новый ОписаниеОповещения("НачатьЗагрузкуКодаИзСервисаЗавершениеВводаСсылки", ЭтотОбъект,
		ПараметрыОповещения),
				 РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры


#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

// Редактор кода отложенная инициализация редакторов.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения - Форма
Процедура РедакторКодаОтложеннаяИнициализацияРедакторов(Форма) Экспорт
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);
	ВидыРедактора = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	РедакторыФормы = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];

	ИнициализироватьРедаторыФормыПослеФормированияПолей(Форма, РедакторыФормы, ВидРедактора, ВидыРедактора);
КонецПроцедуры

// Начать сессию взаимодействия с запросом параметров редактора кода завершение ввода параметров.
// 
// Параметры:
//  Результат - см. УИ_РедакторКодаКлиентСервер.НовыйПараметрыСессииВзаимодействия
//  ДополнительныеПараметры - Структура :
//  	* Форма - ФормаКлиентскогоПриложения
//  	* ИдентификаторРедактора - Строка
Процедура НачатьСессиюВзаимодействияСЗапросомПараметровРедактораКодаЗавершениеВводаПараметров(Результат,
	ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	РедакторыФормы = ДополнительныеПараметры.Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	ПараметрыРедактора = РедакторыФормы[ДополнительныеПараметры.ИдентификаторРедактора]; //см. УИ_РедакторКодаКлиентСервер.НовыйДанныеРедактораФормы
	
	ПараметрыРедактора.ПараметрыСессииВзаимодействия = Результат;
	

	НачатьСессиюВзаимодействияРедактораКода(ДополнительныеПараметры.Форма,
											ДополнительныеПараметры.ИдентификаторРедактора);
КонецПроцедуры

// Начать вставку из буфер обмена завершение получения текста.
// 
// Параметры:
//  Результат - Строка - Результат
//  ДополнительныеПараметры - Структура -Дополнительные параметры:
//  	* Форма - ФормаКлиентскогоПриложения
//  	* Элемент - ПолеФормы
Процедура НачатьВставкуИзБуферОбменаЗавершениеПолученияТекста(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ВставитьТекстПоПозицииКурсораЭлементаФормы(ДополнительныеПараметры.Форма, ДополнительныеПараметры.Элемент, Результат);
КонецПроцедуры

Процедура НачатьКопированиеВыделенногоТекстаВБуферОбменаЗавершение(Результат, ДополнительныеПараметры) Экспорт

КонецПроцедуры

// Начать загрузку кода из сервиса завершение ввода ссылки.
// 
// Параметры:
//  Результат - Строка, Неопределено- Результат
//  ДополнительныеПараметры - Структура - Дополнительные параметры:
//  	* ОповещениеОЗавершении - ОписаниеОповещения -
Процедура НачатьЗагрузкуКодаИзСервисаЗавершениеВводаСсылки(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(Результат) Тогда
		Возврат;
	КонецЕсли;
	
	ДанныеСсылки = УИ_РедакторКодаВызовСервера.ДанныеАлгоритмаВСервисе(Результат);
	
	Если ДанныеСсылки = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, ДанныеСсылки);
КонецПроцедуры

// Начать загрузку кода из сервиса завершение.
// 
// Параметры:
//  Результат - см. УИ_Paste1CAPI.НовыйДанныеАлгоритма
//  ДополнительныеПараметры - Структура -Дополнительные параметры:
//  	* Форма - ФормаКлиентскогоПриложения
//  	* ИдентификаторРедактора - Строка
Процедура НачатьЗагрузкуКодаИзСервисаЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УстановитьТекстРедактора(ДополнительныеПараметры.Форма,
							 ДополнительныеПараметры.ИдентификаторРедактора,
							 Результат.Текст);
КонецПроцедуры

// Начать сборку обработок для исполнения кода завершение сохранения шаблона обработки.
// 
// Параметры:
//  Успешно - Булево- Результат
//  ДополнительныеПараметры - см. НовыйПараметрыСборкиОбработокДляРедакторов
Процедура НачатьСборкуОбработокДляИсполненияКодаЗавершениеСохраненияШаблонаОбработки(Успешно,
	ДополнительныеПараметры) Экспорт
	
	Если Не Успешно Тогда
		Возврат;
	КонецЕсли;
	
	УИ_УправлениеКонфигураторомКлиент.НачатьПолучениеКонтекстаКомандыКонфигуратора(Новый ОписаниеОповещения("НачатьСборкуОбработокДляИсполненияКодаЗавершениеПолученияКонтекстаРедактора",
		ЭтотОбъект, ДополнительныеПараметры));


КонецПроцедуры

// Начать сборку обработок для исполнения кода сборка обработки для очередного редактора.
// 
// Параметры:
//  ПараметрыСборкиОбработок - см. НовыйПараметрыСборкиОбработокДляРедакторов
//  ОписаниеОповещенияОЗавершении -ОписаниеОповещения -Описание оповещения о завершении
Процедура НачатьСборкуОбработокДляИсполненияКодаСборкаОбработкиДляОчередногоРедактора(ПараметрыСборкиОбработок,
	ОписаниеОповещенияОЗавершении) Экспорт

	РедакторДляСборки = ПараметрыСборкиОбработок.РедакторыДляСборки[ПараметрыСборкиОбработок.ИндексРедактораДляСборки];

	ИмяФайлаМодуля = УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(ПараметрыСборкиОбработок.КаталогШаблонаОбработки,
																	"ШаблонОбработки",
																	"Ext",
																	"ObjectModule.bsl");
	
	//Текст модуля
	Текст = Новый ТекстовыйДокумент;
	Если РедакторДляСборки.ИсполнениеНаКлиенте Тогда
		Текст.УстановитьТекст("");
	Иначе
		Текст.УстановитьТекст(РедакторДляСборки.ТекстРедактораДляОбработки);
	КонецЕсли;
	
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("ПараметрыСборкиОбработок", ПараметрыСборкиОбработок);
	ПараметрыОповещения.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);
	ПараметрыОповещения.Вставить("РедакторДляСборки", РедакторДляСборки);

	Текст.НачатьЗапись(Новый ОписаниеОповещения("НачатьСборкуОбработокДляИсполненияКодаСборкаОбработкиДляОчередногоРедактораЗавершениеЗаписиМодуляОбработки",
		ЭтотОбъект, ПараметрыОповещения), ИмяФайлаМодуля, "UTF8");
КонецПроцедуры

// Начать сборку обработок для исполнения кода сборка обработки для очередного редактора завершение записи модуля обработки.
// 
// Параметры:
//  Результат - Булево, Неопределено -Результат
//  ДополнительныеПараметры - Структура- Дополнительные параметры:
//  	* ПараметрыСборкиОбработок - см. НовыйПараметрыСборкиОбработокДляРедакторов
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
//  	* РедакторДляСборки - см. УИ_РедакторКодаКлиентСервер.НовыйДанныеРедактораДляСборкиОбработки
Процедура НачатьСборкуОбработокДляИсполненияКодаСборкаОбработкиДляОчередногоРедактораЗавершениеЗаписиМодуляОбработки(Результат,
	ДополнительныеПараметры) Экспорт

	Если Результат <> Истина Тогда
		Возврат;
	КонецЕсли;

	ИмяФайлаМодуля = УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(ДополнительныеПараметры.ПараметрыСборкиОбработок.КаталогШаблонаОбработки,
																												   "ШаблонОбработки",
																												   "Forms",
																												   "Форма"),
																	"Ext", "Form", "Module.bsl");
	
	//Текст формы
	Текст = Новый ТекстовыйДокумент;
	Если ДополнительныеПараметры.РедакторДляСборки.ИсполнениеНаКлиенте Тогда
		Текст.УстановитьТекст(ДополнительныеПараметры.РедакторДляСборки.ТекстРедактораДляОбработки);
	Иначе
		Текст.УстановитьТекст("");
	КонецЕсли;
	Текст.НачатьЗапись(Новый ОписаниеОповещения("НачатьСборкуОбработокДляИсполненияКодаСборкаОбработкиДляОчередногоРедактораЗавершениеЗаписиМодуляФормы",
		ЭтотОбъект, ДополнительныеПараметры), ИмяФайлаМодуля, "UTF8");
	
КонецПроцедуры

// Начать сборку обработок для исполнения кода сборка обработки для очередного редактора завершение записи модуля обработки.
// 
// Параметры:
//  Результат - Булево, Неопределено -Результат
//  ДополнительныеПараметры - Структура- Дополнительные параметры:
//  	* ПараметрыСборкиОбработок - см. НовыйПараметрыСборкиОбработокДляРедакторов
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
//  	* РедакторДляСборки - см. УИ_РедакторКодаКлиентСервер.НовыйДанныеРедактораДляСборкиОбработки
Процедура НачатьСборкуОбработокДляИсполненияКодаСборкаОбработкиДляОчередногоРедактораЗавершениеЗаписиМодуляФормы(Результат,
	ДополнительныеПараметры) Экспорт

	Если Результат <> Истина Тогда
		Возврат;
	КонецЕсли;

	ИмяФайлаОбработки = УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(ДополнительныеПараметры.ПараметрыСборкиОбработок.КаталогШаблонаОбработки,
																	   "ОбработкаДляРедактора.epf");
	ИмяИсходногоФайлаОбработки = УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(ДополнительныеПараметры.ПараметрыСборкиОбработок.КаталогШаблонаОбработки,
																				"ШаблонОбработки.xml");
	ДополнительныеПараметры.Вставить("ИмяФайлаОбработки", ИмяФайлаОбработки);

	УИ_УправлениеКонфигураторомКлиент.НачатьСборкуОбработкиИзФайлов(ДополнительныеПараметры.ПараметрыСборкиОбработок.КонтекстКомандыКонфигуратора,
																	ИмяИсходногоФайлаОбработки,
																	ИмяФайлаОбработки,
																	Новый ОписаниеОповещения("НачатьСборкуОбработокДляИсполненияКодаСборкаОбработкиДляОчередногоРедактораЗавершениеФормированияФайлаОбработки",
		ЭтотОбъект, ДополнительныеПараметры));

КонецПроцедуры

// Начать сборку обработок для исполнения кода сборка обработки для очередного редактора завершение формирования файла обработки.
// 
// Параметры:
//  Результат - Булево -Результат
//  ДополнительныеПараметры - Структура- Дополнительные параметры:
//  	* ПараметрыСборкиОбработок - см. НовыйПараметрыСборкиОбработокДляРедакторов
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
//  	* РедакторДляСборки - см. УИ_РедакторКодаКлиентСервер.НовыйДанныеРедактораДляСборкиОбработки
//  	* ИмяФайлаОбработки - Строка
Процедура НачатьСборкуОбработокДляИсполненияКодаСборкаОбработкиДляОчередногоРедактораЗавершениеФормированияФайлаОбработки(Результат,
	ДополнительныеПараметры) Экспорт
	Если Результат <> Истина Тогда
		Возврат;
	КонецЕсли;

	НачатьСозданиеДвоичныхДанныхИзФайла(Новый ОписаниеОповещения("НачатьСборкуОбработокДляИсполненияКодаСборкаОбработкиДляОчередногоРедактораЗавершениеПолученияДвоичныхДанныхОбработки",
		ЭтотОбъект, ДополнительныеПараметры), ДополнительныеПараметры.ИмяФайлаОбработки);
КонецПроцедуры

// Начать сборку обработок для исполнения кода сборка обработки для очередного редактора завершение получения двоичных данных обработки.
// 
// Параметры:
//  ДвоичныеДанные - ДвоичныеДанные- Результат
//  ДополнительныеПараметры - Структура- Дополнительные параметры:
//  	* ПараметрыСборкиОбработок - см. НовыйПараметрыСборкиОбработокДляРедакторов
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
//  	* РедакторДляСборки - см. УИ_РедакторКодаКлиентСервер.НовыйДанныеРедактораДляСборкиОбработки
//  	* ИмяФайлаОбработки - Строка
Процедура НачатьСборкуОбработокДляИсполненияКодаСборкаОбработкиДляОчередногоРедактораЗавершениеПолученияДвоичныхДанныхОбработки(ДвоичныеДанные,
	ДополнительныеПараметры) Экспорт

	АдресДвоичныхДанныхВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные,
																			ДополнительныеПараметры.ПараметрыСборкиОбработок.Форма.УникальныйИдентификатор);
	УИ_ОбщегоНазначенияВызовСервера.ПодключитьВнешнююОбработкуКСеансу(АдресДвоичныхДанныхВоВременномХранилище,
																	  ДополнительныеПараметры.РедакторДляСборки.ИмяПодключаемойОбработки);
																	  
		
	РедакторыФормы = УИ_РедакторКодаКлиентСервер.РедакторыФормы(ДополнительныеПараметры.ПараметрыСборкиОбработок.Форма);
	ПараметрыРедактора = РедакторыФормы[ДополнительныеПараметры.РедакторДляСборки.Идентификатор]; //см. УИ_РедакторКодаКлиентСервер.НовыйДанныеРедактораФормы

	КэшРезультатовПодключенияОбработкиИсполнения = УИ_РедакторКодаКлиентСервер.НовыйКэшРезультатовПодключенияОбработкиИсполнения();
	КэшРезультатовПодключенияОбработкиИсполнения.ТекстРедактора = ДополнительныеПараметры.РедакторДляСборки.ТекстРедактора;
	КэшРезультатовПодключенияОбработкиИсполнения.ИсполнениеНаКлиенте = ДополнительныеПараметры.РедакторДляСборки.ИсполнениеНаКлиенте;

	Для Каждого Стр Из ДополнительныеПараметры.РедакторДляСборки.ИменаПредустановленныхПеременных Цикл
		КэшРезультатовПодключенияОбработкиИсполнения.ИменаПредустановленныхПеременных.Добавить(НРег(Стр));
	КонецЦикла;
	ПараметрыРедактора.КэшРезультатовПодключенияОбработкиИсполнения = КэшРезультатовПодключенияОбработкиИсполнения;

	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Истина);
КонецПроцедуры

// Начать сборку обработок для исполнения кода завершение сборки обработки для очередного редактора.
// 
// Параметры:
//  Результат -Булево-Результат
//  ДополнительныеПараметры - см. НовыйПараметрыСборкиОбработокДляРедакторов
Процедура НачатьСборкуОбработокДляИсполненияКодаЗавершениеСборкиОбработкиДляОчередногоРедактора(Результат,
	ДополнительныеПараметры) Экспорт
	Если Результат <> Истина Тогда
		Возврат;
	КонецЕсли;
	
	ДополнительныеПараметры.ИндексРедактораДляСборки = ДополнительныеПараметры.ИндексРедактораДляСборки + 1;
	Если ДополнительныеПараметры.ИндексРедактораДляСборки >= ДополнительныеПараметры.РедакторыДляСборки.Количество() Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Истина);
	Иначе
		НачатьСборкуОбработокДляИсполненияКодаСборкаОбработкиДляОчередногоРедактора(ДополнительныеПараметры,
																					Новый ОписаниеОповещения("НачатьСборкуОбработокДляИсполненияКодаЗавершениеСборкиОбработкиДляОчередногоРедактора",
			ЭтотОбъект, ДополнительныеПараметры));
	КонецЕсли;
		
КонецПроцедуры

// Начать сохранение шаблона обработки на диск завершение обеспечения каталога.
// 
// Параметры:
//  Успешно - Булево - Успешно
//  ДополнительныеПараметры - Структура:
//  	* ОписаниеОповещенияОЗавершении-ОписаниеОповещения
//  	* Каталог - Строка
Процедура НачатьСохранениеШаблонаОбработкиНаДискЗавершениеОбеспеченияКаталога(Успешно, ДополнительныеПараметры) Экспорт
	Если Не Успешно Тогда
		Возврат;
	КонецЕсли;

	Файл = Новый Файл(УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(ДополнительныеПараметры.Каталог,
																	 "ШаблонОбработки.xml"));
	Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения("НачатьСохранениеШаблонаОбработкиНаДискЗавершениеПроверкиСуществованияСохраненногоШаблона",
		ЭтотОбъект, ДополнительныеПараметры));
КонецПроцедуры

// Начать сохранение шаблона обработки на диск завершение проверки существования сохраненного шаблона.
// 
// Параметры:
//  Существует - Булево - Существует
//  ДополнительныеПараметры - Структура:
//  	* ОписаниеОповещенияОЗавершении-ОписаниеОповещения
//  	* Каталог - Строка
Процедура НачатьСохранениеШаблонаОбработкиНаДискЗавершениеПроверкиСуществованияСохраненногоШаблона(Существует,
	ДополнительныеПараметры) Экспорт
	Если Существует Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Истина);
	Иначе
		АдресШаблонаОбработкиДляСохранения = УИ_ОбщегоНазначенияВызовСервера.АдресДвоичныхДанныхОбщегоМакета("УИ_ШаблонОбработки");

		ИмяФайлаАрхива = УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(ДополнительныеПараметры.Каталог, "шаблон.zip");
		ДополнительныеПараметры.Вставить("ИмяФайлаАрхива", ИмяФайлаАрхива);

		Двоичные = ПолучитьИзВременногоХранилища(АдресШаблонаОбработкиДляСохранения); //ДвоичныеДанные
		Двоичные.НачатьЗапись(Новый ОписаниеОповещения("НачатьСохранениеШаблонаОбработкиНаДискЗавершениеСохраненияАрхиваШаблона",
			ЭтотОбъект, ДополнительныеПараметры), ИмяФайлаАрхива);
	КонецЕсли;
КонецПроцедуры

// Начать сохранение шаблона обработки на диск завершение сохранения архива шаблона.
// 
// Параметры:
//  ДополнительныеПараметры - Структура:
//  	* ОписаниеОповещенияОЗавершении-ОписаниеОповещения
//  	* Каталог - Строка
//  	* ИмяФайлаАрхива - Строка
Процедура НачатьСохранениеШаблонаОбработкиНаДискЗавершениеСохраненияАрхиваШаблона(ДополнительныеПараметры) Экспорт
#Если Не ВебКлиент И Не МобильныйКлиент Тогда
	ЧтениеZIP = Новый ЧтениеZipФайла(ДополнительныеПараметры.ИмяФайлаАрхива);
	ЧтениеZIP.ИзвлечьВсе(ДополнительныеПараметры.Каталог, РежимВосстановленияПутейФайловZIP.Восстанавливать);
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Истина);
#Иначе
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Ложь);
#КонецЕсли

КонецПроцедуры


// Начать сборку обработок для исполнения кода завершение получения контекста редактора.
// 
// Параметры:
//  КонтекстКонфигуратора - см. УИ_УправлениеКонфигураторомКлиент.НовыйКонтекстКомандыКонфигуратора, Неопределено -Контекст конфигуратора
//  ПараметрыСборки - см. НовыйПараметрыСборкиОбработокДляРедакторов - Параметры сборки
Процедура НачатьСборкуОбработокДляИсполненияКодаЗавершениеПолученияКонтекстаРедактора(КонтекстКонфигуратора,
	ПараметрыСборки) Экспорт

	Если КонтекстКонфигуратора = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПараметрыСборки.КонтекстКомандыКонфигуратора = КонтекстКонфигуратора;
	НачатьСборкуОбработокДляИсполненияКодаСборкаОбработкиДляОчередногоРедактора(ПараметрыСборки,
																				Новый ОписаниеОповещения("НачатьСборкуОбработокДляИсполненияКодаЗавершениеСборкиОбработкиДляОчередногоРедактора",
		ЭтотОбъект, ПараметрыСборки));
КонецПроцедуры

Процедура ОткрытьОпределениеПроцедурыМодуляЗавершениеПолученияТекстаМодуля(ТекстМодуля, ДополнительныеПараметры) Экспорт
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("Код", ТекстМодуля);
	ПараметрыФормы.Вставить("ИмяМодуля", ДополнительныеПараметры.ТекущееСобытие.ДанныеСобытия.Модуль);
	ПараметрыФормы.Вставить("ИмяМетодаДляПереходаКОпределению",
							ДополнительныеПараметры.ТекущееСобытие.ДанныеСобытия.Слово);

	ОткрытьФорму("ОбщаяФорма.УИ_ФормаКода",
				 ПараметрыФормы,
				 ,
				 ВРег(ДополнительныеПараметры.ТекущееСобытие.ДанныеСобытия.Модуль));
КонецПроцедуры

Процедура ФормаПриОткрытииЗавершениеПодключенияРасширенияРаботыСФайлами(Результат, ДополнительныеПараметры) Экспорт
	Если Не Результат Тогда
		Возврат;
	КонецЕсли;
	
	СохранитьОчереднуюБиблиотекуРедактораНаДиск(ДополнительныеПараметры);
КонецПроцедуры

// Форма при открытии завершение сохранения очередной библиотеки редактора.
// 
// Параметры:
//  Результат - Булево-Результат
//  ДополнительныеПараметры - Структура :
//  	* КлючБиблиотеки - Строка
//  	* Форма - ФормаКлиентскогоПриложения
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
Процедура ФормаПриОткрытииЗавершениеСохраненияОчереднойБиблиотекиРедактора(Результат, ДополнительныеПараметры) Экспорт
	БиблиотекиФормы = УИ_РедакторКодаКлиентСервер.ДанныеБиблиотекРедакторов(ДополнительныеПараметры.Форма);
	
	Библиотека = БиблиотекиФормы[ДополнительныеПараметры.КлючБиблиотеки];//см. УИ_РедакторКодаКлиентСервер.НовыйБиблиотекаРедактораКодаФормы
	Библиотека.БиблиотекаРаспакована = Истина;
	
	СохранитьОчереднуюБиблиотекуРедактораНаДиск(ДополнительныеПараметры);
КонецПроцедуры

Процедура ФормаПриОткрытииЗавершениеСохраненияБиблиотекРедакторов(Результат, ДополнительныеПараметры) Экспорт
	Форма = ДополнительныеПараметры.Форма;

	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	
	БиблиотекиРедакторов = УИ_РедакторКодаКлиентСервер.ДанныеБиблиотекРедакторов(Форма);
	
	ТекущаяБиблиотека = Неопределено;//см. УИ_РедакторКодаКлиентСервер.НовыйБиблиотекаРедактораКодаФормы
	БиблиотекиРедакторов.Свойство(ВидРедактора,ТекущаяБиблиотека);

	Если УИ_РедакторКодаКлиентСервер.РедакторКодаИспользуетПолеHTML(ВидРедактора) И ТекущаяБиблиотека <> Неопределено Тогда
		Для Каждого КлючЗначение Из Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()] Цикл
			//ИмяРеквизитаРедактора = УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКода(КлючЗначение.Значение.ИмяРеквизита);	

			АдресРедактораДляПоляHTML = "";

			Если ВидРедактора = ВидыРедакторов.Monaco Тогда
				АдресРедактораДляПоляHTML = ТекущаяБиблиотека.КаталогСохраненияБиблиотеки
											+ ПолучитьРазделительПути()
											+ "index.html";
			ИначеЕсли ВидРедактора = ВидыРедакторов.Ace Тогда
				АдресРедактораДляПоляHTML = ТекущаяБиблиотека.КаталогСохраненияБиблиотеки
											+ ПолучитьРазделительПути()
											+ КлючЗначение.Значение.Язык
											+ ".html";
			КонецЕсли;
			
			//Пермещаемые профили windows
			Если СтрНачинаетсяС(АдресРедактораДляПоляHTML, "\\") Тогда
				АдресРедактораДляПоляHTML = "file://" + АдресРедактораДляПоляHTML;
			КонецЕсли;
			Форма[КлючЗначение.Значение.ИмяРеквизита] = АдресРедактораДляПоляHTML;

		КонецЦикла;
	КонецЕсли;
	
	ФормаПриОткрытииЗавершениеПодготовительныхДействий(Форма, ДополнительныеПараметры.ОписаниеОповещенияОЗавершении);
	
КонецПроцедуры

Процедура СохранитьБиблиотекуРедактораНаДискЗавершениеСозданияКаталогаБиблиотеки(ИмяКаталога, ДополнительныеПараметры) Экспорт

	БиблиотекаРедактора = ДополнительныеПараметры.БиблиотекаРедактора;//см. УИ_РедакторКодаКлиентСервер.НовыйБиблиотекаРедактораКодаФормы

	АдресБиблиотеки = БиблиотекаРедактора.ДанныеБиблиотеки;

	МассивСохраненныхФайлов = Новый Массив;
	ДанныеБиблиотеки = ПолучитьИзВременногоХранилища(АдресБиблиотеки);//см. УИ_РедакторКодаКлиентСервер.НовыйДанныеБиблиотекиРедактора
	
	СоответствиеФайловБиблиотеки = ДанныеБиблиотеки.ДанныеФайлов;

	
	Если БиблиотекаРедактора.ВидРедактора = "Ace" Тогда
		ДобавитьКСохранениюТекстовыйДокументДляЯзыкаРедактораКодаAce(СоответствиеФайловБиблиотеки,
			БиблиотекаРедактора, "bsl");
		ДобавитьКСохранениюТекстовыйДокументДляЯзыкаРедактораКодаAce(СоответствиеФайловБиблиотеки,
			БиблиотекаРедактора, "xml");
		ДобавитьКСохранениюТекстовыйДокументДляЯзыкаРедактораКодаAce(СоответствиеФайловБиблиотеки,
			БиблиотекаРедактора, "bsl_query");
		ДобавитьКСохранениюТекстовыйДокументДляЯзыкаРедактораКодаAce(СоответствиеФайловБиблиотеки,
			БиблиотекаРедактора, "css");
		ДобавитьКСохранениюТекстовыйДокументДляЯзыкаРедактораКодаAce(СоответствиеФайловБиблиотеки,
			БиблиотекаРедактора, "javascript");
		ДобавитьКСохранениюТекстовыйДокументДляЯзыкаРедактораКодаAce(СоответствиеФайловБиблиотеки,
			БиблиотекаРедактора, "html");		
		ДобавитьКСохранениюТекстовыйДокументДляЯзыкаРедактораКодаAce(СоответствиеФайловБиблиотеки,
			БиблиотекаРедактора, "yaml");
		ДобавитьКСохранениюТекстовыйДокументДляЯзыкаРедактораКодаAce(СоответствиеФайловБиблиотеки,
			БиблиотекаРедактора, "json");
	КонецЕсли;

	ДополнительныеПараметры.Вставить("МассивСохраненныхФайлов", МассивСохраненныхФайлов);
	ДополнительныеПараметры.Вставить("СоответствиеФайловБиблиотеки", СоответствиеФайловБиблиотеки);

	СохранитьБиблиотекуРедактораЗаписатьНачатьЗаписьОчередногоФайла(ДополнительныеПараметры);
КонецПроцедуры

Процедура СохранитьБиблиотекуРедактораРаспаковатьБиблиотекуРедактораВКаталог(ДополнительныеПараметры,
	ОписаниеОповещенияОЗаверешнии) Экспорт
#Если Не ВебКлиент И Не МобильныйКлиент Тогда
	Поток=ДополнительныеПараметры.СоответствиеФайловБиблиотеки[ДополнительныеПараметры.ТекКлючФайла].ОткрытьПотокДляЧтения();

	ЧтениеZIP=Новый ЧтениеZipФайла(Поток);
	ЧтениеZIP.ИзвлечьВсе(ДополнительныеПараметры.БиблиотекаРедактора.КаталогСохраненияБиблиотеки,
		РежимВосстановленияПутейФайловZIP.Восстанавливать);

#КонецЕсли

КонецПроцедуры

Процедура СохранитьБиблиотекуРедактораРаспаковатьБиблиотекуРедактораВКаталогЗавершение(Результат,
	ДополнительныеПараметры) Экспорт

КонецПроцедуры

Процедура СохранитьБиблиотекуРедактораЗаписатьНачатьЗаписьОчередногоФайлаЗавершение(ДополнительныеПараметры) Экспорт
	МассивСохраненныхФайлов = ДополнительныеПараметры.МассивСохраненныхФайлов;
	МассивСохраненныхФайлов.Добавить(ДополнительныеПараметры.ТекКлючФайла);

	Файл = Новый Файл(ДополнительныеПараметры.ТекКлючФайла);

	Если Файл.Расширение = ".zip" Тогда
		СохранитьБиблиотекуРедактораРаспаковатьБиблиотекуРедактораВКаталог(ДополнительныеПараметры,
			Новый ОписаниеОповещения("СохранитьБиблиотекуРедактораРаспаковатьБиблиотекуРедактораВКаталогЗавершение",
			ЭтотОбъект, ДополнительныеПараметры));
	КонецЕсли;	
		//Иначе
	СохранитьБиблиотекуРедактораЗаписатьНачатьЗаписьОчередногоФайла(ДополнительныеПараметры);
	//КонецЕсли;
КонецПроцедуры

Процедура СохранитьБиблиотекуРедактораЗаписатьНачатьЗаписьОчередногоФайлаТекстовогоДокументаЗавершение(Результат,
	ДополнительныеПараметры) Экспорт
	МассивСохраненныхФайлов = ДополнительныеПараметры.МассивСохраненныхФайлов;
	МассивСохраненныхФайлов.Добавить(ДополнительныеПараметры.ТекКлючФайла);

	СохранитьБиблиотекуРедактораЗаписатьНачатьЗаписьОчередногоФайла(ДополнительныеПараметры);
КонецПроцедуры

Процедура СохранитьБиблиотекуРедактораНаДискЗавершениеПроверкиСуществованияБиблиотекиНаДиске(Существует,
	ДополнительныеПараметры) Экспорт
	Если Существует Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении);
		Возврат;
	КонецЕсли;
	БиблиотекаРедактора = ДополнительныеПараметры.БиблиотекаРедактора;//см. УИ_РедакторКодаКлиентСервер.НовыйБиблиотекаРедактораКодаФормы

	НачатьСозданиеКаталога(
		Новый ОписаниеОповещения("СохранитьБиблиотекуРедактораНаДискЗавершениеСозданияКаталогаБиблиотеки", ЭтотОбъект,
		ДополнительныеПараметры), БиблиотекаРедактора.КаталогСохраненияБиблиотеки);

КонецПроцедуры

Процедура СохранитьМодулиКонфигурацииВФайлыЗавершениеПодключенияРасширенияРаботыСФайлами(Результат,
	ДополнительныеПараметры) Экспорт
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ТекущиеКаталоги", ДополнительныеПараметры.ТекущиеКаталоги);

	ДополнительныеПараметрыОповещения = Новый Структура;
	ДополнительныеПараметрыОповещения.Вставить("ОписаниеОповещенияОЗавершении",
		ДополнительныеПараметры.ОписаниеОповещенияОЗавершении);

	ОткрытьФорму("ОбщаяФорма.УИ_НастройкиСохраненияИсходныхФайловКонфигурации", ПараметрыФормы, , , , ,
		Новый ОписаниеОповещения("СохранитьМодулиКонфигурацииВФайлыЗавершениеНастроек", ЭтотОбъект,
		ДополнительныеПараметрыОповещения), РежимОткрытияОкнаФормы.Независимый);

КонецПроцедуры

Процедура СохранитьМодулиКонфигурацииВФайлыЗавершениеНастроек(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ОписаниеМетаданныхКонфигурации = УИ_РедакторКодаВызовСервера.ОписаниеМетаданныхКонфигурации(Ложь);

	ПараметрыСохраненияИсходныхФайлов = Новый Структура;
	ПараметрыСохраненияИсходныхФайлов.Вставить("ОписаниеМетаданныхКонфигурации", ОписаниеМетаданныхКонфигурации);
	ПараметрыСохраненияИсходныхФайлов.Вставить("Параметры", Результат);
	ПараметрыСохраненияИсходныхФайлов.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
	ПараметрыСохраненияИсходныхФайлов.Вставить("ИндексКаталога", 0);

	СохранитьМодулиКонфигурацииВФайлыНачалоОбработкиКаталогаИсточника(ПараметрыСохраненияИсходныхФайлов);

КонецПроцедуры

Процедура СохранитьМодулиКонфигурацииВФайлыНачалоОбработкиКаталогаИсточника(ПараметрыСохранения)
	Если ПараметрыСохранения.ИндексКаталога >= ПараметрыСохранения.Параметры.КаталогиИсточников.Количество() Тогда
		СохранитьМодулиКонфигурацииВФайлыЗавершение(ПараметрыСохранения);
		Возврат;
	КонецЕсли;

	ОписаниеКаталогаИсточника = ПараметрыСохранения.Параметры.КаталогиИсточников[ПараметрыСохранения.ИндексКаталога];

	ПараметрыСохранения.Вставить("ОписаниеКаталогаИсточника", ОписаниеКаталогаИсточника);
	
	//Сначала нужно очистить каталог
	НачатьУдалениеФайлов(Новый ОписаниеОповещения("СохранитьМодулиКонфигурацииВФайлыЗавершениеУдалениеФайловКаталога",
		ЭтотОбъект, ПараметрыСохранения), ОписаниеКаталогаИсточника.Каталог, "*");

КонецПроцедуры

Процедура СохранитьМодулиКонфигурацииВФайлыЗавершениеУдалениеФайловКаталога(ПараметрыСохранения) Экспорт
	Если ПараметрыСохранения.ОписаниеКаталогаИсточника.ТолькоМодули Тогда
		СохранитьМодулиКонфигурацииВФайлыСохранитьСписокМетаданныхСМодулями(ПараметрыСохранения);
	Иначе
		СохранитьМодулиКонфигурацииВФайлыЗАпуститьКонфигуратовДляВыгрузкиМетаданных(ПараметрыСохранения);
	КонецЕсли;
КонецПроцедуры

Процедура СохранитьМодулиКонфигурацииВФайлыСохранитьСписокМетаданныхСМодулями(ПараметрыСохранения) Экспорт
	ТекстМетаданных = Новый ТекстовыйДокумент;

	Если ПараметрыСохранения.ОписаниеКаталогаИсточника.Источник <> "ОсновнаяКонфигурация" Тогда
		ИмяРасширения = ПараметрыСохранения.ОписаниеКаталогаИсточника.Источник;
	Иначе
		ИмяРасширения = Неопределено;
	КонецЕсли;
	
	Для Каждого ТекКоллекция Из ПараметрыСохранения.ОписаниеМетаданныхКонфигурации Цикл
		Если ТипЗнч(ТекКоллекция.Значение)<> Тип("Структура") Тогда
			Продолжить;
		КонецЕсли;
		
		Если ТекКоллекция.Ключ = "Справочники" Тогда
			ИмяКоллекцииДляФайла = "Catalog";
		ИначеЕсли ТекКоллекция.Ключ = "Документы" Тогда
			ИмяКоллекцииДляФайла = "Document";
		ИначеЕсли ТекКоллекция.Ключ = "РегистрыСведений" Тогда
			ИмяКоллекцииДляФайла = "InformationRegister";
		ИначеЕсли ТекКоллекция.Ключ = "РегистрыНакопления" Тогда
			ИмяКоллекцииДляФайла = "AccumulationRegister";
		ИначеЕсли ТекКоллекция.Ключ = "РегистрыБухгалтерии" Тогда
			ИмяКоллекцииДляФайла = "AccountingRegister";
		ИначеЕсли ТекКоллекция.Ключ = "РегистрыРасчета" Тогда
			ИмяКоллекцииДляФайла = "CalculationRegister";
		ИначеЕсли ТекКоллекция.Ключ = "Обработки" Тогда
			ИмяКоллекцииДляФайла = "DataProcessor";
		ИначеЕсли ТекКоллекция.Ключ = "Отчеты" Тогда
			ИмяКоллекцииДляФайла = "Report";
		ИначеЕсли ТекКоллекция.Ключ = "Перечисления" Тогда
			ИмяКоллекцииДляФайла = "Enum";
		ИначеЕсли ТекКоллекция.Ключ = "ОбщиеМодули" Тогда
			ИмяКоллекцииДляФайла = "CommonModule";
		ИначеЕсли ТекКоллекция.Ключ = "ПланыСчетов" Тогда
			ИмяКоллекцииДляФайла = "ChartOfAccounts";
		ИначеЕсли ТекКоллекция.Ключ = "БизнесПроцессы" Тогда
			ИмяКоллекцииДляФайла = "BusinessProcess";
		ИначеЕсли ТекКоллекция.Ключ = "Задачи" Тогда
			ИмяКоллекцииДляФайла = "Task";
		ИначеЕсли ТекКоллекция.Ключ = "ПланыОбмена" Тогда
			ИмяКоллекцииДляФайла = "ExchangePlan";
		ИначеЕсли ТекКоллекция.Ключ = "ПланыВидовХарактеристик" Тогда
			ИмяКоллекцииДляФайла = "ChartOfCharacteristicTypes";
		ИначеЕсли ТекКоллекция.Ключ = "ПланыВидовРасчета" Тогда
			ИмяКоллекцииДляФайла = "ChartOfCalculationTypes";
		ИначеЕсли ТекКоллекция.Ключ = "Константы" Тогда
			ИмяКоллекцииДляФайла = "Constant";
		Иначе
			Продолжить;
		КонецЕсли;
		
		Для Каждого КлючЗначениеМетаданных Из ТекКоллекция.Значение Цикл
			Если КлючЗначениеМетаданных.Значение.Расширение<>ИмяРасширения Тогда
				Продолжить;
			КонецЕсли;
			ТекстМетаданных.ДобавитьСтроку(ИмяКоллекцииДляФайла+"."+КлючЗначениеМетаданных.Ключ);
		КонецЦикла;
	КонецЦикла;
	
	СтруктураФайловыхПеременныхСеанса = УИ_ОбщегоНазначенияКлиент.СтруктураФайловыхПеременныхСеанса();
	ИмяФайлаСохранения = СтруктураФайловыхПеременныхСеанса.РабочийКаталогДанныхПользователя + ПолучитьРазделительПути() + "tools_ui_1c_list_metadata.txt";
	ПараметрыСохранения.Вставить("ИмяФайлаСпискаМетаданных", ИмяФайлаСохранения);
	ТекстМетаданных.НачатьЗапись(
		Новый ОписаниеОповещения("СохранитьМодулиКонфигурацииВФайлыСохранитьСписокМетаданныхСМодулямиЗавершение",
		ЭтотОбъект, ПараметрыСохранения), ИмяФайлаСохранения);

КонецПроцедуры

Процедура СохранитьМодулиКонфигурацииВФайлыСохранитьСписокМетаданныхСМодулямиЗавершение(Результат, ПараметрыСохранения) Экспорт
	Если Результат<>Истина Тогда
		Сообщить("Не удалось сохранить список метаданных с модулями в файл для источника "
			+ ПараметрыСохранения.ОписаниеКаталогаИсточника.Источник);

		ПараметрыСохранения.ИндексКаталога = ПараметрыСохранения.ИндексКаталога + 1;
		СохранитьМодулиКонфигурацииВФайлыНачалоОбработкиКаталогаИсточника(ПараметрыСохранения);
		Возврат;
	КонецЕсли;	
	
	СохранитьМодулиКонфигурацииВФайлыЗАпуститьКонфигуратовДляВыгрузкиМетаданных(ПараметрыСохранения);

КонецПроцедуры

Процедура СохранитьМодулиКонфигурацииВФайлыЗАпуститьКонфигуратовДляВыгрузкиМетаданных(ПараметрыСохранения) Экспорт
	СтрокаЗапускаПриложения = УИ_СтроковыеФункцииКлиентСервер.ОбернутьВКавычки(
		ПараметрыСохранения.Параметры.ФайлЗапускаПлатформы) + " DESIGNER";

	Если ПараметрыСохранения.Параметры.РасположениеБазы = 0 Тогда
		СтрокаЗапускаПриложения = СтрокаЗапускаПриложения + " /F " + УИ_СтроковыеФункцииКлиентСервер.ОбернутьВКавычки(
			ПараметрыСохранения.Параметры.КаталогИнформационнойБазы);
	Иначе
		ПутьКБазе = ПараметрыСохранения.Параметры.СерверИБ + "\" + ПараметрыСохранения.Параметры.ИмяБазы;
		СтрокаЗапускаПриложения = СтрокаЗапускаПриложения + " /S " + УИ_СтроковыеФункцииКлиентСервер.ОбернутьВКавычки(
			ПутьКБазе);
	КонецЕсли;
	СтрокаЗапускаПриложения = СтрокаЗапускаПриложения + " /N" + УИ_СтроковыеФункцииКлиентСервер.ОбернутьВКавычки(
		ПараметрыСохранения.Параметры.Пользователь);

	Если ЗначениеЗаполнено(ПараметрыСохранения.Параметры.Пароль) Тогда
		СтрокаЗапускаПриложения = СтрокаЗапускаПриложения + " /P" + УИ_СтроковыеФункцииКлиентСервер.ОбернутьВКавычки(
			ПараметрыСохранения.Параметры.Пароль);
	КонецЕсли;
	СтрокаЗапускаПриложения = СтрокаЗапускаПриложения +" /DisableStartupMessages /DisableStartupDialogs";

	СтрокаЗапускаПриложения = СтрокаЗапускаПриложения + " /DumpConfigToFiles "
		+ УИ_СтроковыеФункцииКлиентСервер.ОбернутьВКавычки(ПараметрыСохранения.ОписаниеКаталогаИсточника.Каталог)
		+ " -format Hierarchical";
		
	Если ПараметрыСохранения.ОписаниеКаталогаИсточника.Источник <> "ОсновнаяКонфигурация" Тогда
		СтрокаЗапускаПриложения = СтрокаЗапускаПриложения + " -Extension "
			+ ПараметрыСохранения.ОписаниеКаталогаИсточника.Источник;
	КонецЕсли;
	Если ПараметрыСохранения.ОписаниеКаталогаИсточника.ТолькоМодули Тогда
		СтрокаЗапускаПриложения = СтрокаЗапускаПриложения + " -listFile "
			+ УИ_СтроковыеФункцииКлиентСервер.ОбернутьВКавычки(ПараметрыСохранения.ИмяФайлаСпискаМетаданных);

	КонецЕсли;
	СтруктураФайловыхПеременныхСеанса = УИ_ОбщегоНазначенияКлиент.СтруктураФайловыхПеременныхСеанса();
	
	ПараметрыСохранения.Вставить("ИмяФайлаЛогаЗапускаКонфигуратора",
		СтруктураФайловыхПеременныхСеанса.РабочийКаталогДанныхПользователя + ПолучитьРазделительПути()
		+ "tools_ui_1c_list_metadata_out.txt");

	СтрокаЗапускаПриложения = СтрокаЗапускаПриложения + " /Out " + УИ_СтроковыеФункцииКлиентСервер.ОбернутьВКавычки(
		ПараметрыСохранения.ИмяФайлаЛогаЗапускаКонфигуратора);

	НачатьЗапускПриложения(
		Новый ОписаниеОповещения("СохранитьМодулиКонфигурацииВФайлыЗавершениеВыгрузкиИсходниковМетаданныхВКаталог",
		ЭтотОбъект, ПараметрыСохранения), СтрокаЗапускаПриложения, , Истина);
КонецПроцедуры

Процедура СохранитьМодулиКонфигурацииВФайлыЗавершениеВыгрузкиИсходниковМетаданныхВКаталог(КодЗавершения,
	ПараметрыСохранения) Экспорт
	Если КодЗавершения <> 0 Тогда
		ТекстовыйДокумент = Новый ТекстовыйДокумент;

		ДополнительныеПараметрыОповещения = Новый Структура;
		ДополнительныеПараметрыОповещения.Вставить("ТекстовыйДокумент", ТекстовыйДокумент);
		ДополнительныеПараметрыОповещения.Вставить("ПараметрыСохранения", ПараметрыСохранения);

		ТекстовыйДокумент.НачатьЧтение(
			Новый ОписаниеОповещения("СохранитьМодулиКонфигурацииВФайлыЗавершениеВыгрузкиИсходниковМетаданныхВКаталогЗавершениеЧтенияЛога",
			ЭтотОбъект, ДополнительныеПараметрыОповещения), ПараметрыСохранения.ИмяФайлаЛогаЗапускаКонфигуратора);
		Возврат;
	КонецЕсли;
	ПараметрыСохранения.ИндексКаталога = ПараметрыСохранения.ИндексКаталога + 1;
	СохранитьМодулиКонфигурацииВФайлыНачалоОбработкиКаталогаИсточника(ПараметрыСохранения);
КонецПроцедуры

Процедура СохранитьМодулиКонфигурацииВФайлыЗавершениеВыгрузкиИсходниковМетаданныхВКаталогЗавершениеЧтенияЛога(ДополнительныеПараметры) Экспорт
	ПараметрыСохранения = ДополнительныеПараметры.ПараметрыСохранения;
	ТекстовыйДокумент = ДополнительныеПараметры.ТекстовыйДокумент;
	Сообщить("Не удалось сохранить исходные файлы для источника "
		+ ПараметрыСохранения.ОписаниеКаталогаИсточника.Источник + ":" + Символы.ПС + ТекстовыйДокумент.ПолучитьТекст());
		
	ПараметрыСохранения.ИндексКаталога = ПараметрыСохранения.ИндексКаталога + 1;
	СохранитьМодулиКонфигурацииВФайлыНачалоОбработкиКаталогаИсточника(ПараметрыСохранения);

КонецПроцедуры

Процедура СохранитьМодулиКонфигурацииВФайлыЗавершение(ПараметрыСохранения)
	ВыполнитьОбработкуОповещения(ПараметрыСохранения.ДополнительныеПараметры.ОписаниеОповещенияОЗавершении,
		ПараметрыСохранения.Параметры.КаталогиИсточников);
КонецПроцедуры

Процедура НачатьЗагрузкуШаблоновКодаВРедакторКодаЗавершение(Результат, ДопПараметры) Экспорт
	Если Результат.Количество()=0 Тогда
		Возврат;
	КонецЕсли;
	
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(ДопПараметры.Форма);
	ВидыРедактора = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	РедакторыФормы = УИ_РедакторКодаКлиентСервер.РедакторыФормы(ДопПараметры.Форма);
	
	Если ВидРедактора<>ВидыРедактора.Monaco Тогда
		Возврат;
	КонецЕсли;
	
	ДанныеРедактора = РедакторыФормы[ДопПараметры.ИдентификаторРедактора];//см. УИ_РедакторКодаКлиентСервер.НовыйДанныеРедактораФормы
	Если Не ДанныеРедактора.Инициализирован Тогда
		Возврат;
	КонецЕсли;
	ЭлементФормыРедактора = ДопПараметры.Форма.Элементы[ДанныеРедактора.ПолеРедактора];

	ДокументView = ЭлементФормыРедактора.Документ.defaultView;
//		ДокументView.clearSnippets();
	Для Каждого ТекТекстШаблонов Из Результат Цикл
		ДокументView.parseSnippets(ТекТекстШаблонов, Истина);
	КонецЦикла;	

КонецПроцедуры

Процедура НачатьЧтениеОчередногоФайлаШалонаКодаЗавершение(ДополнительныеПараметры) Экспорт
	ТекстШаблонов = ДополнительныеПараметры.ТекстовыйДокумент.ПолучитьТекст();
	ДополнительныеПараметры.ТекстыШаблонов.Добавить(ТекстШаблонов);
	
	НачатьЧтениеОчередногоФайлаШалонаКода(ДополнительныеПараметры);
КонецПроцедуры


Процедура НачатьЧтениеОчередногоФайлаШалонаКодаЗавершениеПроверкиСуществованияФайла(Существует, ДополнительныеПараметры) Экспорт

	Если Существует Тогда
		Текст = Новый ТекстовыйДокумент();
		
		ДополнительныеПараметры.Вставить("ТекстовыйДокумент", Текст);
		ОписаниеОповещения = Новый ОписаниеОповещения("НачатьЧтениеОчередногоФайлаШалонаКодаЗавершение", ЭтотОбъект,
			ДополнительныеПараметры);
			
		Текст.НачатьЧтение(ОписаниеОповещения, ДополнительныеПараметры.ИмяФайла);
	Иначе
		НачатьЧтениеОчередногоФайлаШалонаКода(ДополнительныеПараметры);
	КонецЕсли;
	
КонецПроцедуры

Процедура ВставитьМакроКолонкуРедактораЗапросаЗавершение(Результат, ДополнительныеПарамеры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	УИ_РедакторКодаКлиент.ВставитьТекстПоПозицииКурсора(ДополнительныеПарамеры.Форма,
		ДополнительныеПарамеры.ИдентификаторРедактора, Результат);
	
КонецПроцедуры

// Начать поиск файла модуля каталогах исходных файлов завершение поиска файлов.
// 
// Параметры:
//  НайденныеФайлы -Массив Из Файл -Найденные файлы
//  ПараметрыПоиска - Структура - Параметры поиска:
// 		* ОповещениеОЗавершении - ОписаниеОповещения -
// 		* КаталогиИсходников - Массив из см. УИ_РедакторКодаКлиентСервер.НовыйОписаниеКаталогаИсходныхФайловКонфигурации -
// 		* ИндексКаталогаИсходников - Число -
// 		* ИмяМодуля - Строка -
// 		* МассивИменМодуля - Массив из Строка -
// 		* КаталогМодуля - Строка -
// 		* ИмяФайла - Строка -
// 		* ЭтоОбщийМодуль - Булево -
// 		* ИмяКаталогаПоискаФайла - Строка -
// 		* ОписаниеОповещениеЗавершенияПоискаФайла - ОписаниеОповещения -
Процедура НачатьПоискФайлаМодуляКаталогахИсходныхФайловЗавершениеПоискаФайлов(НайденныеФайлы, ПараметрыПоиска) Экспорт
	Если НайденныеФайлы = Неопределено Тогда
		ПараметрыПоиска.ИндексКаталогаИсходников = ПараметрыПоиска.ИндексКаталогаИсходников + 1;
		НачатьПоискФайлаМодуляКаталогахИсходныхФайлов(ПараметрыПоиска,
													  ПараметрыПоиска.ОписаниеОповещениеЗавершенияПоискаФайла);
		Возврат;
	КонецЕсли;

	Если НайденныеФайлы.Количество() = 0 Тогда
		ПараметрыПоиска.ИндексКаталогаИсходников = ПараметрыПоиска.ИндексКаталогаИсходников + 1;
		НачатьПоискФайлаМодуляКаталогахИсходныхФайлов(ПараметрыПоиска,
													  ПараметрыПоиска.ОписаниеОповещениеЗавершенияПоискаФайла);
		Возврат;
	КонецЕсли;

	ИмяФайла = НайденныеФайлы[0].ПолноеИмя;
	ВыполнитьОбработкуОповещения(ПараметрыПоиска.ОписаниеОповещениеЗавершенияПоискаФайла, ИмяФайла);
	
КонецПроцедуры

// Начать получение текста модуля из исходных файлов завершение поиска файлов.
// 
// Параметры:
//  ИмяФайла -Строка-Имя файла
//  ДополнительныеПараметры - Структура - Параметры поиска:
// 		* ОповещениеОЗавершении - ОписаниеОповещения -
// 		* КаталогиИсходников - Массив из см. УИ_РедакторКодаКлиентСервер.НовыйОписаниеКаталогаИсходныхФайловКонфигурации -
// 		* ИндексКаталогаИсходников - Число -
// 		* ИмяМодуля - Строка -
// 		* МассивИменМодуля - Массив из Строка -
// 		* КаталогМодуля - Строка -
// 		* ИмяФайла - Строка -
// 		* ЭтоОбщийМодуль - Булево -
// 		* ИмяКаталогаПоискаФайла - Строка -
// 		* ОписаниеОповещениеЗавершенияПоискаФайла - ОписаниеОповещения -
Процедура НачатьПолучениеТекстаМодуляИзИсходныхФайловЗавершениеПоискаФайлов(ИмяФайла, ДополнительныеПараметры) Экспорт
	ТекстовыйДокумент = Новый ТекстовыйДокумент;

	ДополнительныеПараметры.Вставить("ТекстовыйДокумент", ТекстовыйДокумент);
	ТекстовыйДокумент.НачатьЧтение(Новый ОписаниеОповещения("НачатьПолучениеТекстаМодуляИзИсходныхФайловЗавершениеЧтениеТекстаМодуляИзФайла",
		ЭтотОбъект, ДополнительныеПараметры), ИмяФайла, "UTF8");

КонецПроцедуры

// Начать получение текста модуля из исходных файлов завершение чтение текста модуля из файла.
// 
// Параметры:
//  ДополнительныеПараметры -Структура -Дополнительные параметры:
//  	* ТекстовыйДокумент - ТекстовыйДокумент
//  	* ОповещениеОЗавершении - ОписаниеОповещения
Процедура НачатьПолучениеТекстаМодуляИзИсходныхФайловЗавершениеЧтениеТекстаМодуляИзФайла(ДополнительныеПараметры) Экспорт
	ТекстМодуля = ДополнительныеПараметры.ТекстовыйДокумент.ПолучитьТекст();
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, ТекстМодуля);
КонецПроцедуры

#Область Monaco

Процедура ПриЗавершенииРедактированияФорматнойСтрокиMonaco(Текст, ДополнительныеПараметры) Экспорт
	Если Текст = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ФорматнаяСтрока = СтрЗаменить(Текст, "'", "");
	ФорматнаяСтрока = """" + ФорматнаяСтрока + """";

	ДокументView = ДополнительныеПараметры.Форма.Элементы[ДополнительныеПараметры.Элемент.Имя].Документ.defaultView;

	Если ДополнительныеПараметры.Свойство("Позиция") Тогда
		УстановитьТекстMonaco(ДокументView, ФорматнаяСтрока, УИ_ОбщегоНазначенияКлиентСервер.мЗаписатьJSON(
			ДополнительныеПараметры.Позиция), Истина);
	Иначе
		УстановитьТекстMonaco(ДокументView, ФорматнаяСтрока, , Истина);
	КонецЕсли;
КонецПроцедуры

Процедура ПриЗавершенииРедактированияЗапросаMonaco(Текст, ДополнительныеПараметры) Экспорт
	Если Текст = Неопределено Тогда
		Возврат;
	КонецЕсли;

	isQueryMode = Ложь;
	Если ДополнительныеПараметры.Свойство("isQueryMode") Тогда
		isQueryMode = ДополнительныеПараметры.isQueryMode;
	КонецЕсли;
	
	Если isQueryMode Тогда
		ТекстЗапроса = Текст;
	Иначе
		ТекстЗапроса = СтрЗаменить(Текст, Символы.ПС, Символы.ПС + "|");
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, """", """""");
		ТекстЗапроса = """" + ТекстЗапроса + """";
	КонецЕсли;

	ДокументView = ДополнительныеПараметры.Форма.Элементы[ДополнительныеПараметры.Элемент.Имя].Документ.defaultView;

	Если ДополнительныеПараметры.Свойство("Позиция") Тогда
		Если ДополнительныеПараметры.Позиция.startLineNumber = ДополнительныеПараметры.Позиция.endLineNumber
			И ДополнительныеПараметры.Позиция.startColumn = ДополнительныеПараметры.Позиция.endColumn Тогда
			ДокументView.updateText(ТекстЗапроса);
		Иначе
			УстановитьТекстMonaco(ДокументView, ТекстЗапроса, УИ_ОбщегоНазначенияКлиентСервер.мЗаписатьJSON(
			ДополнительныеПараметры.Позиция), Истина);
		КонецЕсли;
	Иначе
		УстановитьТекстMonaco(ДокументView, ТекстЗапроса, , Истина);
	КонецЕсли;
	
	ДокументView.sendEvent("EVENT_CONTENT_CHANGED");
	
КонецПроцедуры

Процедура ОткрытьКонструкторЗапросаMonacoЗавершениеВопроса(Результат, ДополнительныеПараметры) Экспорт
	Если Результат <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	ОткрытьКонструкторЗапроса("", Новый ОписаниеОповещения("ПриЗавершенииРедактированияЗапросаMonaco", ЭтотОбъект,
		ДополнительныеПараметры));

КонецПроцедуры

Процедура ОткрытьКонструкторФорматнойСтрокиMonacoЗавершениеВопроса(Результат, ДополнительныеПараметры) Экспорт
	Если Результат <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	ОткрытьКонструкторФорматнойСтроки("", Новый ОписаниеОповещения("ПриЗавершенииРедактированияФорматнойСтрокиMonaco",
		ЭтотОбъект, ДополнительныеПараметры));

КонецПроцедуры
#КонецОбласти
#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Инициализировать редаторы формы после формирования полей.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  РедакторыФормы - см. УИ_РедакторКодаКлиентСервер.РедакторыФормы
//  ВидРедактора -Строка -Вид редактора
//  ВидыРедактора - см. УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы
Процедура ИнициализироватьРедаторыФормыПослеФормированияПолей(Форма, РедакторыФормы, ВидРедактора, ВидыРедактора)
	Для Каждого КлючЗначение Из РедакторыФормы Цикл
		ПараметрыРедактора = КлючЗначение.Значение;
		Если Не ПараметрыРедактора.Инициализирован Тогда
			Продолжить;
		КонецЕсли;
		Если ПараметрыРедактора.ГотовКИспользованию Тогда
			Продолжить;
		КонецЕсли;
		ПараметрыРедактора.ГотовКИспользованию = Истина;
		
		ЭлементФормыРедактора = Форма.Элементы[ПараметрыРедактора.ПолеРедактора];
		
		Если ВидРедактора = ВидыРедактора.Текст Тогда
			Если ЗначениеЗаполнено(ПараметрыРедактора.ПараметрыРедактора.РазмерШрифта) Тогда
				ЭлементФормыРедактора.Шрифт = Новый Шрифт(, ПараметрыРедактора.ПараметрыРедактора.РазмерШрифта);
			КонецЕсли;
		ИначеЕсли ВидРедактора = ВидыРедактора.Ace Тогда 
			ДокументView = ЭлементФормыРедактора.Документ.defaultView;
			Если ЗначениеЗаполнено(ПараметрыРедактора.ПараметрыРедактора.РазмерШрифта) Тогда
				ДокументView.editor.setFontSize(ПараметрыРедактора.ПараметрыРедактора.РазмерШрифта);		
			КонецЕсли;
 			ДокументView.editor.setAutoScrollEditorIntoView(Истина);
			ДокументView.editor.resize();
			
			ТекЯзык=НРег(ПараметрыРедактора.Язык);
			Если ТекЯзык = "bsl" Тогда
				ТекЯзык="_1c";
			КонецЕсли;
			
			ДокументView.appTo1C.setMode(ТекЯзык);
			
			Если ТекЯзык <> "_1c" И ТекЯзык <> "bsl_query" Тогда
				ДокументView.editor.setTheme("ace/theme/eclipse");
			КонецЕсли;
			
			Если ЗначениеЗаполнено(ПараметрыРедактора.СобытияРедактора.ПриИзменении) Тогда
				ДокументView.appTo1C.setGenerateModificationEvent(Истина);
			КонецЕсли;
			
		ИначеЕсли ВидРедактора = ВидыРедактора.Monaco Тогда
			ДокументView = ЭлементФормыРедактора.Документ.defaultView;

			ЕстьДобавленныеКомандыКонтекстногоМенюРедактораMonaco = ЕстьДобавленныеКомандыКонтекстногоМенюРедактораMonaco(ДокументView);

			Инфо = Новый СистемнаяИнформация;
			ДокументView.init(Инфо.ВерсияПриложения);
			Если ПараметрыРедактора.Язык <> "bsl" Тогда
				ДокументView.setLanguageMode(ПараметрыРедактора.Язык);
				
				Если ПараметрыРедактора.Язык = "bsl_query" Тогда
					ДокументView.setOption("renderQueryDelimiters", Истина);

					ДобавитьПунктМеню(ДокументView,
									  ЕстьДобавленныеКомандыКонтекстногоМенюРедактораMonaco,
									  "INSERT_MACRO_COLUMN",
									  "Вставить макроколонку");
				КонецЕсли;
			КонецЕсли;
			ДокументView.hideScrollX();
			ДокументView.hideScrollY();
			ДокументView.showStatusBar();
			ДокументView.enableQuickSuggestions();
			Если ЗначениеЗаполнено(ПараметрыРедактора.ПараметрыРедактора.РазмерШрифта) Тогда
				ДокументView.setFontSize(ПараметрыРедактора.ПараметрыРедактора.РазмерШрифта);
			КонецЕсли;
			Если ЗначениеЗаполнено(ПараметрыРедактора.ПараметрыРедактора.ВысотаСтрок) Тогда
				ДокументView.setLineHeight(ПараметрыРедактора.ПараметрыРедактора.ВысотаСтрок);
			КонецЕсли;

			ДокументView.disableKeyBinding(9);//esc
//			ДокументView.disableKeyBinding(2081); //ctrl+c
			ДокументView.setOption("generateDefinitionEvent", Истина);
			ДокументView.setOption("disableDefinitionMessage", Истина);
//			ДокументView.setOption("generateSnippetEvent", Истина);
			ДокументView.setOption("autoResizeEditorLayout", Истина);
			
			
			ДокументView.setOption("dragAndDrop", Истина);

			ТемыРедактора = УИ_РедакторКодаКлиентСервер.ВариантыТемыРедактораMonaco();
			Если ПараметрыРедактора.ПараметрыРедактора.Тема = ТемыРедактора.Темная Тогда
				Если ПараметрыРедактора.Язык = "bsl_query" Тогда
					ДокументView.setTheme("bsl-dark-query");
				Иначе
					ДокументView.setTheme("bsl-dark");
				КонецЕсли;
			Иначе
				Если ПараметрыРедактора.Язык = "bsl_query" Тогда
					ДокументView.setTheme("bsl-white-query");
				Иначе
					ДокументView.setTheme("bsl-white");
				КонецЕсли;
			КонецЕсли;

			ЯзыкиРедактора = УИ_РедакторКодаКлиентСервер.ВариантыЯзыкаСинтаксисаРедактораMonaco();
			Если ПараметрыРедактора.ПараметрыРедактора.ЯзыкСинтаксиса = ЯзыкиРедактора.Английский Тогда
				ДокументView.switchLang("en");
			ИначеЕсли ПараметрыРедактора.ПараметрыРедактора.ЯзыкСинтаксиса = ЯзыкиРедактора.Авто Тогда
				ЯзыкСинтаксиса = УИ_ПараметрыПриложения["ЯзыкСинтаксисаКонфигурации"];
				Если ЯзыкСинтаксиса = "Английский" Тогда
					ДокументView.switchLang("en");
				КонецЕсли;
			КонецЕсли;

			ДокументView.minimap(ПараметрыРедактора.ПараметрыРедактора.ИспользоватьКартуКода);

			Если ПараметрыРедактора.ПараметрыРедактора.СкрытьНомераСтрок Тогда
				ДокументView.hideLineNumbers();
			КонецЕсли;

			Если ПараметрыРедактора.ПараметрыРедактора.ОтображатьПробелыИТабуляции Тогда
				ДокументView.renderWhitespace(Истина);
			КонецЕсли;
			
			Если ЗначениеЗаполнено(ПараметрыРедактора.СобытияРедактора.ПриИзменении) Тогда
				ДокументView.setOption("generateModificationEvent", Истина);
			КонецЕсли;
						
			Если ПараметрыРедактора.ПараметрыРедактора.ИспользоватьКомандыРаботыСБуферомВКонтекстномМеню Тогда
				ДобавитьПунктМеню(ДокументView,
								  ЕстьДобавленныеКомандыКонтекстногоМенюРедактораMonaco,
								  "TOOLS_UI_1C_COPY_TO_CLIPBOARD",
								  "Копировать");
				ДобавитьПунктМеню(ДокументView,
								  ЕстьДобавленныеКомандыКонтекстногоМенюРедактораMonaco,
								  "TOOLS_UI_1C_PASTE_FROM_CLIPBOARD",
								  "Вставить");
			КонецЕсли;
						
			ДокументView.clearMetadata();

			ОписаниеКонфигурацииДляИнициализации = ОписаниеМетаданныйДляИнициализацииРедактораMonaco();

			ДокументView.updateMetadata(УИ_ОбщегоНазначенияКлиентСервер.мЗаписатьJSON(
				ПолучитьСписокОбъектовМетаданныхИзКоллекцииДляРедактораMonaco(
				ОписаниеКонфигурацииДляИнициализации.ОбщиеМодули)), "commonModules.items");
			
			Если Не ПараметрыРедактора.ПараметрыРедактора.Monaco.ИспользоватьСтандартныеШаблоныКода Тогда
				ДокументView.clearSnippets();
			КонецЕсли;
		КонецЕсли;
	
		Если ПараметрыРедактора.КэшТекстаРедактора <> Неопределено Тогда
			УстановитьТекстРедактора(Форма, КлючЗначение.Ключ, ПараметрыРедактора.КэшТекстаРедактора.Текст);
			УстановитьОригинальныйТекстРедактора(Форма,
												 КлючЗначение.Ключ,
												 ПараметрыРедактора.КэшТекстаРедактора.ОригинальныйТекст);
			ПараметрыРедактора.КэшТекстаРедактора = Неопределено;
		КонецЕсли;
		
		Если ПараметрыРедактора.ТолькоПросмотр Тогда
			УстановитьРежимТолькоПросмотрРедактора(Форма, КлючЗначение.Ключ, Истина);
		КонецЕсли;

		Если Не ПараметрыРедактора.БылаВыполненаИнициализацияРанее Тогда
			ПараметрыРедактора.БылаВыполненаИнициализацияРанее = Истина;
			
			Форма.Подключаемый_РедакторКодаЗавершениеИнициализацииРедактора(КлючЗначение.Ключ);
			Если ВидРедактора = ВидыРедактора.Monaco Тогда
				НачатьЗагрузкуШаблоновКодаВРедакторКода(Форма, КлючЗначение.Ключ);
			КонецЕсли;
		КонецЕсли;

	КонецЦикла;
КонецПроцедуры

// Редактор кода формы готов к использованию.
// 
// Параметры:
//  РедакторыФормы -см. УИ_РедакторКодаКлиентСервер.РедакторыФормы
//  ИдентификаторРедактора - Строка -Идентификатор редактора
// 
// Возвращаемое значение:
//  Булево
Функция РедакторКодаФормыГотовКИспользованию(РедакторыФормы, ИдентификаторРедактора)
	Редактор  = РедакторыФормы[ИдентификаторРедактора];//см. УИ_РедакторКодаКлиентСервер.НовыйДанныеРедактораФормы
	Возврат Редактор.ГотовКИспользованию
КонецФункции

// Форма при открытии завершение подготовительных действий.
// 
// Параметры:
//  Форма -  ФормаКлиентскогоПриложения
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения, Неопределено - Описание оповещения о завершении
Процедура ФормаПриОткрытииЗавершениеПодготовительныхДействий(Форма, ОписаниеОповещенияОЗавершении)
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);
	Если Не УИ_РедакторКодаКлиентСервер.РедакторКодаИспользуетПолеHTML(ВидРедактора) Тогда
		РедакторКодаОтложеннаяИнициализацияРедакторов(Форма);
	КонецЕсли;
	 
	// Оповестим о завершении обработки инициализации редакторов при открытии формы
	ОписаниеОповещенияОЗавершении= ОписаниеОповещенияОЗавершении;
	Если ОписаниеОповещенияОЗавершении = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ВыполнитьОбработкуОповещения(ОписаниеОповещенияОЗавершении, Истина);
	
КонецПроцедуры

Процедура НачатьСохранениеШаблонаОбработкиНаДиск(Каталог, ОписаниеОповещенияОЗавершении)
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);
	ПараметрыОповещения.Вставить("Каталог", Каталог);

	УИ_ОбщегоНазначенияКлиент.НачатьОбеспечениеКаталога(Каталог,
														Новый ОписаниеОповещения("НачатьСохранениеШаблонаОбработкиНаДискЗавершениеОбеспеченияКаталога",
		ЭтотОбъект, ПараметрыОповещения));
КонецПроцедуры


Процедура НачатьЗагрузкуШаблоновКодаВРедакторКода(Форма, ИдентификаторРедактора)
	РедакторыФормы = УИ_РедакторКодаКлиентСервер.РедакторыФормы(Форма);
	ДанныеРедактора = РедакторыФормы[ИдентификаторРедактора];//см. УИ_РедакторКодаКлиентСервер.НовыйДанныеРедактораФормы\
	
	ПараметрыРедактора = ДанныеРедактора.ПараметрыРедактора;
	
	Если ПараметрыРедактора.Monaco.ФайлыШаблоновКода.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыОповещения = Новый Структура;
	ПараметрыОповещения.Вставить("Форма",Форма);
	ПараметрыОповещения.Вставить("ИдентификаторРедактора",ИдентификаторРедактора);
	
	ДопПараметры = Новый Структура;
	ДопПараметры.Вставить("ФайлыШаблоновКода", ПараметрыРедактора.Monaco.ФайлыШаблоновКода);
	ДопПараметры.Вставить("ТекстыШаблонов", Новый Массив);
	ДопПараметры.Вставить("ИндексЧитаемогоФайла", 0);
	ДопПараметры.Вставить("ОписаниеОповещенияОЗавершении",
						  Новый ОписаниеОповещения("НачатьЗагрузкуШаблоновКодаВРедакторКодаЗавершение", ЭтотОбъект,
		ПараметрыОповещения));

	НачатьЧтениеОчередногоФайлаШалонаКода(ДопПараметры);
	
КонецПроцедуры

Процедура НачатьЧтениеОчередногоФайлаШалонаКода(ДополнительныеПараметры)
	Если ДополнительныеПараметры.ФайлыШаблоновКода.Количество() <= ДополнительныеПараметры.ИндексЧитаемогоФайла Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении,
			ДополнительныеПараметры.ТекстыШаблонов);

		Возврат;
	КонецЕсли;
	
	ИмяЧитаемогоФайла = ДополнительныеПараметры.ФайлыШаблоновКода[ДополнительныеПараметры.ИндексЧитаемогоФайла];
	ДополнительныеПараметры.Вставить("ИмяФайла", ИмяЧитаемогоФайла);
	ДополнительныеПараметры.ИндексЧитаемогоФайла = ДополнительныеПараметры.ИндексЧитаемогоФайла + 1;

	Файл = Новый Файл(ИмяЧитаемогоФайла);
	Файл.НачатьПроверкуСуществования(
		Новый ОписаниеОповещения("НачатьЧтениеОчередногоФайлаШалонаКодаЗавершениеПроверкиСуществованияФайла",
		ЭтотОбъект, ДополнительныеПараметры));
КонецПроцедуры

Процедура ДобавитьВТекстДополнениеВНачалеСтрокиПоГраницамВыделения(ТекстКода, ГраницыВыделения, Дополнение)
	Текст = Новый ТекстовыйДокумент;
	Текст.УстановитьТекст(ТекстКода);

	Если ГраницыВыделения = Неопределено Тогда
		НачалоСтроки = 1;
		КонецСтроки = Текст.КоличествоСтрок();
	Иначе

		Если Не ЗначениеЗаполнено(ГраницыВыделения.НачалоСтроки) И Не ЗначениеЗаполнено(ГраницыВыделения.КонецСтроки) Тогда
			Возврат;
		КонецЕсли;
		НачалоСтроки = ГраницыВыделения.НачалоСтроки;
		КонецСтроки = ГраницыВыделения.КонецСтроки;

	КонецЕсли;

	Для НомерСтроки = НачалоСтроки По КонецСтроки Цикл
		СтрокаТекста = Текст.ПолучитьСтроку(НомерСтроки);
		Текст.ЗаменитьСтроку(НомерСтроки, Дополнение + СтрокаТекста);
	КонецЦикла;
	ТекстКода = Текст.ПолучитьТекст();
КонецПроцедуры

Процедура УдалитьТекстДополнениеВНачалеСтрокиПоГраницамВыделения(ТекстКода, ГраницыВыделения, Дополнение)
	Текст = Новый ТекстовыйДокумент;
	Текст.УстановитьТекст(ТекстКода);
	
	Если ГраницыВыделения = Неопределено Тогда
		НачалоСтроки = 1;
		КонецСтроки = Текст.КоличествоСтрок();
	Иначе

		Если Не ЗначениеЗаполнено(ГраницыВыделения.НачалоСтроки) И Не ЗначениеЗаполнено(ГраницыВыделения.КонецСтроки) Тогда
			Возврат;
		КонецЕсли;
		НачалоСтроки = ГраницыВыделения.НачалоСтроки;
		КонецСтроки = ГраницыВыделения.КонецСтроки;

	КонецЕсли;

	Для НомерСтроки = НачалоСтроки По КонецСтроки Цикл
		СтрокаТекста = Текст.ПолучитьСтроку(НомерСтроки);
		Если СтрНачинаетсяС(СтрокаТекста, Дополнение) Тогда
			СтрокаТекста = Сред(СтрокаТекста,СтрДлина(Дополнение)+1);
		КонецЕсли;
		
		Текст.ЗаменитьСтроку(НомерСтроки, СтрокаТекста);
	КонецЦикла;
	ТекстКода = Текст.ПолучитьТекст();
КонецПроцедуры

Функция НовыйСобытиеРедактораКодаДляОбработки()
	Событие = Новый Структура();
	Событие.Вставить("Элемент");
	Событие.Вставить("ИмяСобытия");
	Событие.Вставить("ДанныеСобытия");
	
	Возврат Событие;
КонецФункции

Функция ПодготовитьТекстЗапросаДляКонструктора(Текст)

	ТекстЗапроса = СтрЗаменить(Текст, "|", "");
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, """""", "$");
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, """", "");
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "$", """");

	Возврат ТекстЗапроса;
КонецФункции

Функция НовыйГраницыВыделения() 
	Границы = Новый Структура;
	Границы.Вставить("НачалоСтроки", 1);
	Границы.Вставить("НачалоКолонки", 1);
	Границы.Вставить("КонецСтроки", 1);
	Границы.Вставить("КонецКолонки", 1);
	
	Возврат Границы;
КонецФункции

#Область Monaco

Процедура ЗаполнитьСтруктуруКонтекстаРедактораКодаMonaco(ОбъектыДобавления, ДобавляемыйКонтекст, СоответствиеТипов)
	Для Каждого КлючЗначение Из ДобавляемыйКонтекст Цикл
		ОбъектДобавляемый = Новый Структура("ref,name");
		ОбъектДобавляемый.name = КлючЗначение.Ключ;
		Если ТипЗнч(КлючЗначение.Значение) = Тип("Структура") Тогда
			ИмяТипа = КлючЗначение.Значение.Тип;

			Если КлючЗначение.Значение.Свойство("ПодчиненныеСвойства") 
				И КлючЗначение.Значение.ПодчиненныеСвойства.Количество()>0 Тогда

				ОбъектДобавляемый.Вставить("properties", Новый Структура);
				
				ЗаполнитьСтруктуруКонтекстаРедактораКодаMonaco(ОбъектДобавляемый.properties,
															   КлючЗначение.Значение.ПодчиненныеСвойства,
															   СоответствиеТипов);
//				Для Каждого Свойство Из КлючЗначение.Значение.ПодчиненныеСвойства Цикл
//					ДобавитьОписаниеРеквизитаДляРедактораMonaco(ОбъектДобавляемый.properties,
//																Свойство,
//																Истина,
//																СоответствиеТипов);
//				КонецЦикла;

			КонецЕсли;

		Иначе
			ИмяТипа = КлючЗначение.Значение;
		КонецЕсли;
		ОбъектДобавляемый.ref = ТипРедактораМонакоПоСтрокеТипа1С(ИмяТипа, СоответствиеТипов);
		ОбъектыДобавления.Вставить(КлючЗначение.Ключ, ОбъектДобавляемый);
	КонецЦикла;
	
КонецПроцедуры

Функция ОписаниеМетаданныйДляИнициализацииРедактораMonaco()
	Описание = УИ_ПараметрыПриложения["ОписаниеМетаданныйДляИнициализацииРедактораMonaco"];
	Если Описание <> Неопределено Тогда
		Возврат Описание;
	КонецЕсли;

	ОписаниеКонфигурацииДляИнициализации = УИ_РедакторКодаВызовСервера.ОписнаиеМетаданныйДляИнициализацииРедактораMonaco();
	УИ_ПараметрыПриложения.Вставить("ОписаниеМетаданныйДляИнициализацииРедактораMonaco",
		ОписаниеКонфигурацииДляИнициализации);

	Возврат ОписаниеКонфигурацииДляИнициализации;

КонецФункции

Процедура УстановитьТекстMonaco(ДокументView, Текст, Позиция = Неопределено, УчитыватьОтступПервойСтроки = Истина)
	ДокументView.setText(Текст, Позиция);
КонецПроцедуры

Процедура ОткрытьКонструкторФорматнойСтрокиMonaco(ПараметрыСобытия, ДополнительныеПараметры)
	Если ПараметрыСобытия = Неопределено Тогда
		УИ_ОбщегоНазначенияКлиент.ПоказатьВопросПользователю(
			Новый ОписаниеОповещения("ОткрытьКонструкторФорматнойСтрокиMonacoЗавершениеВопроса", ЭтотОбъект,
			ДополнительныеПараметры), "Форматная строка не найдена." + Символы.ПС + "Создать новую форматную строку?",
			РежимДиалогаВопрос.ДаНет);
	Иначе
		ФорматнаяСтрока = СтрЗаменить(СтрЗаменить(ПараметрыСобытия.text, "|", ""), """", "");

		ПараметрыОповещения = ДополнительныеПараметры;

		Позиция = Новый Структура;
		Позиция.Вставить("startLineNumber", ПараметрыСобытия.startLineNumber);
		Позиция.Вставить("startColumn", ПараметрыСобытия.startColumn);
		Позиция.Вставить("endLineNumber", ПараметрыСобытия.endLineNumber);
		Позиция.Вставить("endColumn", ПараметрыСобытия.endColumn);

		ПараметрыОповещения.Вставить("Позиция", Позиция);

		ОткрытьКонструкторФорматнойСтроки(ФорматнаяСтрока,
			Новый ОписаниеОповещения("ПриЗавершенииРедактированияФорматнойСтрокиMonaco", ЭтотОбъект,
			ПараметрыОповещения));
	КонецЕсли;
КонецПроцедуры

Процедура ОткрытьКонструкторЗапросаMonaco(ПараметрыСобытия, ДополнительныеПараметры)
	Если ПараметрыСобытия = Неопределено Тогда
		УИ_ОбщегоНазначенияКлиент.ПоказатьВопросПользователю(Новый ОписаниеОповещения("ОткрытьКонструкторЗапросаMonacoЗавершениеВопроса",
			ЭтотОбъект, ДополнительныеПараметры),
															 "Не найден текст запроса." + Символы.ПС + "Создать новый запрос?",
															 РежимДиалогаВопрос.ДаНет);
	Иначе
		Если ПараметрыСобытия.isQueryMode Тогда
			ТекстЗапроса = ПараметрыСобытия.text;
		Иначе
			ТекстЗапроса = ПодготовитьТекстЗапросаДляКонструктора(ПараметрыСобытия.text);
		КонецЕсли;

		ПараметрыОповещения = ДополнительныеПараметры;

		Позиция = Новый Структура;
		Позиция.Вставить("startLineNumber", ПараметрыСобытия.startLineNumber);
		Позиция.Вставить("startColumn", ПараметрыСобытия.startColumn);
		Позиция.Вставить("endLineNumber", ПараметрыСобытия.endLineNumber);
		Позиция.Вставить("endColumn", ПараметрыСобытия.endColumn);

		ПараметрыОповещения.Вставить("Позиция", Позиция);
		ПараметрыОповещения.Вставить("isQueryMode", ПараметрыСобытия.isQueryMode);

		ОткрытьКонструкторЗапроса(ТекстЗапроса, Новый ОписаниеОповещения("ПриЗавершенииРедактированияЗапросаMonaco",
			ЭтотОбъект, ПараметрыОповещения));
	КонецЕсли;
КонецПроцедуры

// Событие для обработки при нажатии monaco.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -Форма
//  Элемент - ПолеФормы-Элемент
//  ДанныеСобытия  -ФиксированнаяСтруктура- Данные события
// 
// Возвращаемое значение:
//  см. НовыйСобытиеРедактораКодаДляОбработки
// Возвращаемое значение:
//  Неопределено - Событие не требует обработки
Функция СобытиеДляОбработкиПриНажатииMonaco(Форма, Элемент, ДанныеСобытия)
#Если ВебКлиент Тогда
	Событие = ДанныеСобытия.Event.detail;
#Иначе
		Событие = ДанныеСобытия.Event.eventData1C;
#КонецЕсли
	Если Событие = Неопределено Или ТипЗнч(Событие) = Тип("Число") Тогда
		Возврат Неопределено;
	КонецЕсли;
//	СтандартнаяОбработка = Ложь;
		
	СобытиеДляОбработки = НовыйСобытиеРедактораКодаДляОбработки();
	СобытиеДляОбработки.Элемент = Элемент;
	СобытиеДляОбработки.ИмяСобытия = Событие.event;
	
	ДанныеСобытияДляОбработки = Неопределено;
	Если Событие.event = "EVENT_GET_METADATA" Тогда
		ДанныеСобытияДляОбработки = Новый Структура;
		ДанныеСобытияДляОбработки.Вставить("ИмяМетаданных", Событие.params.metadata);
		ДанныеСобытияДляОбработки.Вставить("ИсточникСобытия", Событие.params.trigger);
		Если ДанныеСобытияДляОбработки.ИсточникСобытия = "snippet" Тогда
			ДанныеСобытияДляОбработки.Вставить("ИдентификаторШаблона", Событие.params.snippet_guid);
		КонецЕсли;
		
	ИначеЕсли Событие.event = "EVENT_QUERY_CONSTRUCT" Тогда 
		ПараметрыЗапроса = Событие.params;
		ДокументHTMLView = ДанныеСобытия.Document.defaultView;
		
		Если ДокументHTMLView.isQueryMode() Тогда
			ГраницыВыделения = ГраницыВыделенияРедактораЭлементаФормы(Форма, Элемент);
			ДанныеСобытияДляОбработки = Новый Структура;
			ДанныеСобытияДляОбработки.Вставить("isQueryMode", Истина);
			ДанныеСобытияДляОбработки.Вставить("startLineNumber", ГраницыВыделения.НачалоСтроки);
			ДанныеСобытияДляОбработки.Вставить("startColumn", ГраницыВыделения.НачалоКолонки);
			ДанныеСобытияДляОбработки.Вставить("endLineNumber", ГраницыВыделения.КонецСтроки);
			ДанныеСобытияДляОбработки.Вставить("endColumn", ГраницыВыделения.КонецКолонки);
			ДанныеСобытияДляОбработки.Вставить("text", ДокументHTMLView.getText());
		Иначе
			Если ПараметрыЗапроса = Неопределено Тогда
				ПараметрыЗапроса = ДокументHTMLView.getQuery();
			КонецЕсли;

			Если ПараметрыЗапроса <> Неопределено И ?(ТипЗнч(ПараметрыЗапроса) = Тип("Строка"), ЗначениеЗаполнено(
				ПараметрыЗапроса), Истина) Тогда
				ДанныеСобытияДляОбработки = Новый Структура;
				ДанныеСобытияДляОбработки.Вставить("isQueryMode", Ложь);
				ДанныеСобытияДляОбработки.Вставить("startLineNumber", ПараметрыЗапроса.range.startLineNumber);
				ДанныеСобытияДляОбработки.Вставить("startColumn", ПараметрыЗапроса.range.startColumn);
				ДанныеСобытияДляОбработки.Вставить("endLineNumber", ПараметрыЗапроса.range.endLineNumber);
				ДанныеСобытияДляОбработки.Вставить("endColumn", ПараметрыЗапроса.range.endColumn);
				ДанныеСобытияДляОбработки.Вставить("text", ПараметрыЗапроса.text);
			КонецЕсли;

		КонецЕсли;
		
	ИначеЕсли Событие.event = "EVENT_FORMAT_CONSTRUCT" Тогда 
		Если Событие.params <> Неопределено И ЗначениеЗаполнено(ПараметрыЗапроса) Тогда
			ДанныеСобытияДляОбработки = Новый Структура;
			ДанныеСобытияДляОбработки.Вставить("startLineNumber", Событие.params.range.startLineNumber);
			ДанныеСобытияДляОбработки.Вставить("startColumn", Событие.params.range.startColumn);
			ДанныеСобытияДляОбработки.Вставить("endLineNumber", Событие.params.range.endLineNumber);
			ДанныеСобытияДляОбработки.Вставить("endColumn", Событие.params.range.endColumn);
			ДанныеСобытияДляОбработки.Вставить("text", Событие.params.text);
		КонецЕсли;
	ИначеЕсли Событие.event = "EVENT_GET_DEFINITION" Тогда 
		ДанныеСобытияДляОбработки = Новый Структура;
		ДанныеСобытияДляОбработки.Вставить("Слово", Событие.params.word);
		ДанныеСобытияДляОбработки.Вставить("ПолноеВыражение", Событие.params.expression);
		ДанныеСобытияДляОбработки.Вставить("Модуль", Событие.params.module);
		ДанныеСобытияДляОбработки.Вставить("ИмяОбъекта", Событие.params.class);
		ДанныеСобытияДляОбработки.Вставить("НомерСтроки", Событие.params.line);
		ДанныеСобытияДляОбработки.Вставить("НомерКолонки", Событие.params.column);
		//ДанныеСобытияДляОбработки.Вставить("МассивВыражения", Событие.params.expression_array);
		
	КонецЕсли;	
	
	СобытиеДляОбработки.ДанныеСобытия = ДанныеСобытияДляОбработки;

	Возврат СобытиеДляОбработки;	
КонецФункции

Функция ИмяКаталогаВидаМетаданных(ВидОбъектаМетаданных)
	Если ВидОбъектаМетаданных = "справочники" Тогда
		Возврат "Catalogs";
	ИначеЕсли ВидОбъектаМетаданных = "документы" Тогда
		Возврат "Documents";
	ИначеЕсли ВидОбъектаМетаданных = "константы" Тогда
		Возврат "Constants";
	ИначеЕсли ВидОбъектаМетаданных = "перечисления" Тогда
		Возврат "Enums";
	ИначеЕсли ВидОбъектаМетаданных = "отчеты" Тогда
		Возврат "Reports";
	ИначеЕсли ВидОбъектаМетаданных = "обработки" Тогда
		Возврат "DataProcessors";
	ИначеЕсли ВидОбъектаМетаданных = "планывидовхарактеристик" Тогда
		Возврат "ChartsOfCharacteristicTypes";
	ИначеЕсли ВидОбъектаМетаданных = "планысчетов" Тогда
		Возврат "ChartsOfAccounts";
	ИначеЕсли ВидОбъектаМетаданных = "планывидоврасчета" Тогда
		Возврат "ChartsOfCalculationTypes";
	ИначеЕсли ВидОбъектаМетаданных = "регистрысведений" Тогда
		Возврат "InformationRegisters";
	ИначеЕсли ВидОбъектаМетаданных = "регистрынакопления" Тогда
		Возврат "AccumulationRegisters";
	ИначеЕсли ВидОбъектаМетаданных = "регистрыбухгалтерии" Тогда
		Возврат "AccountingRegisters";
	ИначеЕсли ВидОбъектаМетаданных = "регистрырасчета" Тогда
		Возврат "CalculationRegisters";
	ИначеЕсли ВидОбъектаМетаданных = "бизнеспроцессы" Тогда
		Возврат "BusinessProcesses";
	ИначеЕсли ВидОбъектаМетаданных = "задачи" Тогда
		Возврат "Tasks";
	ИначеЕсли ВидОбъектаМетаданных = "планыобмена" Тогда
		Возврат "ExchangePlans";
	КонецЕсли;

КонецФункции

// Начать получение текста модуля из исходных файлов.
// 
// Параметры:
//  ИмяМодуля - Строка - Имя модуля. module.УИ_ОбщегоНазначения, module.manager.документы.авансовыйотчет, module.object.документы.авансовыйотчет
//  КаталогиИсходныхФайлов -Массив из см. УИ_РедакторКодаКлиентСервер.НовыйОписаниеКаталогаИсходныхФайловКонфигурации -
//  ОписаниеОповещенияОЗавершении -ОписаниеОповещения -Описание оповещения о завершении
Процедура НачатьПолучениеТекстаМодуляИзИсходныхФайлов(ИмяМодуля, КаталогиИсходныхФайлов, ОписаниеОповещенияОЗавершении)
	Если КаталогиИсходныхФайлов.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	МассивИменМодуля = СтрРазделить(ИмяМодуля, ".");

	Если МассивИменМодуля.Количество() < 2 Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыПоиска = Новый Структура;
	ПараметрыПоиска.Вставить("ОповещениеОЗавершении", ОписаниеОповещенияОЗавершении);
	ПараметрыПоиска.Вставить("КаталогиИсходников", КаталогиИсходныхФайлов);
	ПараметрыПоиска.Вставить("ИндексКаталогаИсходников", 0);
	ПараметрыПоиска.Вставить("ИмяМодуля", ИмяМодуля);
	ПараметрыПоиска.Вставить("МассивИменМодуля", МассивИменМодуля);
	
	ВидМодуля = МассивИменМодуля[1];

	Если ВидМодуля = "manager" Тогда
		ПараметрыПоиска.Вставить("ОписаниеОбъектаМетаданных",
								 УИ_РедакторКодаВызовСервера.ОписаниеОбъектаМетаданныхКонфигурацииПоИмени(МассивИменМодуля[2],
																										  МассивИменМодуля[3]));
		ПараметрыПоиска.Вставить("КаталогМодуля", ИмяКаталогаВидаМетаданных(МассивИменМодуля[2]));
		ПараметрыПоиска.Вставить("ИмяФайла", "ManagerModule.bsl");

		ПараметрыПоиска.Вставить("ЭтоОбщийМодуль", Ложь);

	ИначеЕсли ВидМодуля = "object" Тогда
		ПараметрыПоиска.Вставить("ОписаниеОбъектаМетаданных",
								 УИ_РедакторКодаВызовСервера.ОписаниеОбъектаМетаданныхКонфигурацииПоИмени(МассивИменМодуля[2],
																										  МассивИменМодуля[3]));
		ПараметрыПоиска.Вставить("КаталогМодуля", ИмяКаталогаВидаМетаданных(МассивИменМодуля[2]));
		ПараметрыПоиска.Вставить("ИмяФайла", "ObjectModule.bsl");

		ПараметрыПоиска.Вставить("ЭтоОбщийМодуль", Ложь);
	Иначе
		ПараметрыПоиска.Вставить("ОписаниеОбъектаМетаданных",
								 УИ_РедакторКодаВызовСервера.ОписаниеОбъектаМетаданныхКонфигурацииПоИмени("ОбщиеМодули",
																										  МассивИменМодуля[1]));
		ПараметрыПоиска.Вставить("КаталогМодуля", "CommonModules");
		ПараметрыПоиска.Вставить("ИмяФайла", "Module.bsl");

		ПараметрыПоиска.Вставить("ЭтоОбщийМодуль", Истина);
	КонецЕсли;

	НачатьПоискФайлаМодуляКаталогахИсходныхФайлов(ПараметрыПоиска,
												  Новый ОписаниеОповещения("НачатьПолучениеТекстаМодуляИзИсходныхФайловЗавершениеПоискаФайлов",
		ЭтотОбъект, ПараметрыПоиска));
КонецПроцедуры

// Начать поиск файла модуля каталогах исходных файлов.
// 
// Параметры:
//  ПараметрыПоиска - Структура - Параметры поиска:
// 		* ОповещениеОЗавершении - ОписаниеОповещения -
// 		* КаталогиИсходников - Массив из см. УИ_РедакторКодаКлиентСервер.НовыйОписаниеКаталогаИсходныхФайловКонфигурации -
// 		* ИндексКаталогаИсходников - Число -
// 		* ИмяМодуля - Строка -
// 		* МассивИменМодуля - Массив из Строка -
// 		* КаталогМодуля - Строка -
// 		* ИмяФайла - Строка -
// 		* ЭтоОбщийМодуль - Булево -
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения - Описание оповещения о завершении
Процедура НачатьПоискФайлаМодуляКаталогахИсходныхФайлов(ПараметрыПоиска, ОписаниеОповещенияОЗавершении)
	Если ПараметрыПоиска.КаталогиИсходников.Количество() <= ПараметрыПоиска.ИндексКаталогаИсходников Тогда
		Возврат;
	КонецЕсли;
	
	КаталогИсходныхФайлов = ПараметрыПоиска.КаталогиИсходников[ПараметрыПоиска.ИндексКаталогаИсходников].Каталог;

	Если Не ЗначениеЗаполнено(КаталогИсходныхФайлов) Тогда
		ПараметрыПоиска.ИндексКаталогаИсходников = ПараметрыПоиска.ИндексКаталогаИсходников + 1;
		НачатьПоискФайлаМодуляКаталогахИсходныхФайлов(ПараметрыПоиска, ОписаниеОповещенияОЗавершении);
		Возврат;
	КонецЕсли;

	ИмяКаталогаПоискаФайла = УИ_ОбщегоНазначенияКлиентСервер.ОбъединитьПути(КаталогИсходныхФайлов,
																			ПараметрыПоиска.КаталогМодуля,
																			ПараметрыПоиска.ОписаниеОбъектаМетаданных.Имя);
	ПараметрыПоиска.Вставить("ИмяКаталогаПоискаФайла", ИмяКаталогаПоискаФайла);
	ПараметрыПоиска.Вставить("ОписаниеОповещениеЗавершенияПоискаФайла", ОписаниеОповещенияОЗавершении);

	НачатьПоискФайлов(Новый ОписаниеОповещения("НачатьПоискФайлаМодуляКаталогахИсходныхФайловЗавершениеПоискаФайлов",
		ЭтотОбъект, ПараметрыПоиска), ИмяКаталогаПоискаФайла, ПараметрыПоиска.ИмяФайла, Истина);

КонецПроцедуры

Процедура НачатьПоискФайлаМодуляВКаталогеИсходныхФайлов(ДополнительныеПараметры)
	Если ДополнительныеПараметры.КаталогиИсходников.Количество() <= ДополнительныеПараметры.ИндексКаталогаИсходников Тогда
		Возврат;
	КонецЕсли;
	КаталогИсходныхФайлов = ДополнительныеПараметры.КаталогиИсходников[ДополнительныеПараметры.ИндексКаталогаИсходников].Каталог;

	Если Не ЗначениеЗаполнено(КаталогИсходныхФайлов) Тогда
		ДополнительныеПараметры.ИндексКаталогаИсходников = ДополнительныеПараметры.ИндексКаталогаИсходников + 1;
		НачатьПоискФайлаМодуляВКаталогеИсходныхФайлов(ДополнительныеПараметры);
		Возврат;
	КонецЕсли;

	ИмяКаталогаПоискаФайла = КаталогИсходныхФайлов + ПолучитьРазделительПути() + ДополнительныеПараметры.КаталогМодуля
		+ ПолучитьРазделительПути() + ДополнительныеПараметры.ОписаниеОбъектаМетаданных.Имя;
	ДополнительныеПараметры.Вставить("ИмяКаталогаПоискаФайла", ИмяКаталогаПоискаФайла);

	НачатьПоискФайлов(Новый ОписаниеОповещения("УстановитьОписаниеМодуляДляРедактораMonacoЗавершениеПоискаФайловМодуля",
		ЭтотОбъект, ДополнительныеПараметры), ИмяКаталогаПоискаФайла, ДополнительныеПараметры.ИмяФайлаМодуля, Истина);

КонецПроцедуры

Процедура УстановитьОписаниеМодуляДляРедактораMonaco(ОбновляемыйОбъектМетаданных, ДополнительныеПараметры)
	МассивИменМетаданного = СтрРазделить(ОбновляемыйОбъектМетаданных, ".");

	Если МассивИменМетаданного.Количество() < 2 Тогда
		Возврат;
	КонецЕсли;

	РедакторыФормы = ДополнительныеПараметры.Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаСписокРедакторовФормы()];
	ИдентификаторРедактора = УИ_РедакторКодаКлиентСервер.ИдентификаторРедактораПоЭлементуФормы(
		ДополнительныеПараметры.Форма, ДополнительныеПараметры.Элемент);
	ПараметрыРедактора = РедакторыФормы[ИдентификаторРедактора];
	ДополнительныеПараметры.Вставить("КаталогиИсходников", ПараметрыРедактора.ПараметрыРедактора.КаталогиИсходныхФайлов);

	Если ДополнительныеПараметры.КаталогиИсходников.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	ДополнительныеПараметры.Вставить("ИндексКаталогаИсходников", 0);

	ВидМодуля = МассивИменМетаданного[1];

	ДополнительныеПараметры.Вставить("ОбновляемыйОбъектМетаданных", ОбновляемыйОбъектМетаданных);
	ДополнительныеПараметры.Вставить("МассивИменМетаданного", МассивИменМетаданного);

	Если ВидМодуля = "manager" Тогда
		ОписаниеОбъектаМетаданных = УИ_РедакторКодаВызовСервера.ОписаниеОбъектаМетаданныхКонфигурацииПоИмени(
			МассивИменМетаданного[2], МассивИменМетаданного[3]);

		КаталогМодуля = ИмяКаталогаВидаМетаданных(МассивИменМетаданного[2]);
		ИмяФайла = "ManagerModule.bsl";

		ДополнительныеПараметры.Вставить("ЭтоОбщийМодуль", Ложь);

	ИначеЕсли ВидМодуля = "object" Тогда
		ОписаниеОбъектаМетаданных = УИ_РедакторКодаВызовСервера.ОписаниеОбъектаМетаданныхКонфигурацииПоИмени(
			МассивИменМетаданного[2], МассивИменМетаданного[3]);

		КаталогМодуля = ИмяКаталогаВидаМетаданных(МассивИменМетаданного[2]);
		ИмяФайла = "ObjectModule.bsl";

		ДополнительныеПараметры.Вставить("ЭтоОбщийМодуль", Ложь);
	Иначе
		ОписаниеОбъектаМетаданных = УИ_РедакторКодаВызовСервера.ОписаниеОбъектаМетаданныхКонфигурацииПоИмени(
			"ОбщиеМодули", МассивИменМетаданного[1]);

		КаталогМодуля = "CommonModules";
		ИмяФайла = "Module.bsl";

		ДополнительныеПараметры.Вставить("ЭтоОбщийМодуль", Истина);
	КонецЕсли;

	ДополнительныеПараметры.Вставить("ОписаниеОбъектаМетаданных", ОписаниеОбъектаМетаданных);
	ДополнительныеПараметры.Вставить("КаталогМодуля", КаталогМодуля);
	ДополнительныеПараметры.Вставить("ИмяФайлаМодуля", ИмяФайла);

	НачатьПоискФайлаМодуляВКаталогеИсходныхФайлов(ДополнительныеПараметры);
КонецПроцедуры
Процедура УстановитьОписаниеМодуляДляРедактораMonacoЗавершениеПоискаФайловМодуля(НайденныеФайлы,
	ДополнительныеПараметры) Экспорт
	Если НайденныеФайлы = Неопределено Тогда
		ДополнительныеПараметры.ИндексКаталогаИсходников = ДополнительныеПараметры.ИндексКаталогаИсходников + 1;
		НачатьПоискФайлаМодуляВКаталогеИсходныхФайлов(ДополнительныеПараметры);
		Возврат;
	КонецЕсли;

	Если НайденныеФайлы.Количество() = 0 Тогда
		ДополнительныеПараметры.ИндексКаталогаИсходников = ДополнительныеПараметры.ИндексКаталогаИсходников + 1;
		НачатьПоискФайлаМодуляВКаталогеИсходныхФайлов(ДополнительныеПараметры);
		Возврат;
	КонецЕсли;

	ИмяФайла = НайденныеФайлы[0].ПолноеИмя;
	ДополнительныеПараметры.Вставить("ИмяФайла", ИмяФайла);

	ТекстовыйДокумент = Новый ТекстовыйДокумент;

	ДополнительныеПараметры.Вставить("ТекстовыйДокумент", ТекстовыйДокумент);
	ТекстовыйДокумент.НачатьЧтение(
		Новый ОписаниеОповещения("УстановитьОписаниеМодуляДляРедактораMonacoЗавершениеЧтенияФайла", ЭтотОбъект,
		ДополнительныеПараметры), ДополнительныеПараметры.ИмяФайла);

КонецПроцедуры

Процедура УстановитьОписаниеМодуляДляРедактораMonacoЗавершениеЧтенияФайла(ДополнительныеПараметры) Экспорт
	ТекстМодуля = ДополнительныеПараметры.ТекстовыйДОкумент.ПолучитьТекст();

	ДокументView = ДополнительныеПараметры.Элемент.Документ.defaultView;

	Если ДополнительныеПараметры.ЭтоОбщийМодуль Тогда
		ДокументView.parseCommonModule(ДополнительныеПараметры.ОписаниеОбъектаМетаданных.Имя, ТекстМодуля, Ложь);
	Иначе
		СоответствиеОбновляемыхОбъектовМетаданных = СоответствиеОбновляемыхОбъектовМетаданныхРедактораMonacoИПараметровСобытияОблновленияМетаданных();
		ОбновляемаяКоллекцияРедактора = СоответствиеОбновляемыхОбъектовМетаданных[ДополнительныеПараметры.ОписаниеОбъектаМетаданных.ВидОбъекта];
		ОбновляемаяКоллекцияРедактора = ОбновляемаяКоллекцияРедактора + "."
			+ ДополнительныеПараметры.ОписаниеОбъектаМетаданных.Имя + "."
			+ ДополнительныеПараметры.МассивИменМетаданного[1];

		ДокументView.parseMetadataModule(ТекстМодуля, ОбновляемаяКоллекцияРедактора);
	КонецЕсли;
	ДокументView.triggerSuggestions();

КонецПроцедуры

Процедура УстановитьОписаниеМетаданныхДляРедактораMonaco(ОбновляемыйОбъектМетаданных, ДополнительныеПараметры)

	МассивИменМетаданного = СтрРазделить(ОбновляемыйОбъектМетаданных, ".");

	ВидОбъекта = ВидОбъектаМетаданныхПоВидуМетаданныхОтРедактораMonaco(МассивИменМетаданного[0]);

	СоответствиеОбновляемыхОбъектовМетаданных = СоответствиеОбновляемыхОбъектовМетаданныхРедактораMonacoИПараметровСобытияОблновленияМетаданных();
	ОбновляемаяКоллекцияРедактора = СоответствиеОбновляемыхОбъектовМетаданных[ВидОбъекта];

	Если МассивИменМетаданного.Количество() = 1 Тогда
		ОбновляемыеДанные = Новый Структура;

		МассивИмен = УИ_РедакторКодаВызовСервера.СписокМетаданныхПоВиду(ВидОбъекта);
		Для Каждого ТекИмя Из МассивИмен Цикл
			ОбновляемыеДанные.Вставить(ТекИмя, Новый Структура);
		КонецЦикла;
	Иначе
		ОписаниеОбъектаМетаданных = УИ_РедакторКодаВызовСервера.ОписаниеОбъектаМетаданныхКонфигурацииПоИмени(
			ВидОбъекта, МассивИменМетаданного[1]);
		Описание = ОписаниеОбъектаМетаданныхДляРедактораMonaco(ОписаниеОбъектаМетаданных);

		ОбновляемыеДанные = Описание;

		ОбновляемаяКоллекцияРедактора = ОбновляемаяКоллекцияРедактора + "." + ОписаниеОбъектаМетаданных.Имя;
	КонецЕсли;

	ДокументView = ДополнительныеПараметры.Элемент.Документ.defaultView;
	ДокументView.updateMetadata(УИ_ОбщегоНазначенияКлиентСервер.мЗаписатьJSON(
			ОбновляемыеДанные), ОбновляемаяКоллекцияРедактора);

	Если ДополнительныеПараметры.ДанныеСобытия.ИсточникСобытия = "snippet" Тогда
		ДокументView.updateSnippetByGUID(ДополнительныеПараметры.ДанныеСобытия.ИдентификаторШаблона);
	КонецЕсли;
	ДокументView.triggerSuggestions();
КонецПроцедуры

Функция ТипРедактораМонакоПоСтрокеТипа1С(Тип1СИлиСтрока, СоответствиеСсылочныхТипов)
	Если СоответствиеСсылочныхТипов = Неопределено Тогда
		Возврат "";
	КонецЕсли;

	Тип1С = Тип1СИлиСтрока;
	Если ТипЗнч(Тип1С) = Тип("Строка") Тогда
		Если СтрНайти(Тип1СИлиСтрока, ".") > 0 Тогда
			Возврат Тип1СИлиСтрока;
		КонецЕсли;
		
		Попытка
			Тип1С = Тип(Тип1С);
		Исключение
			Возврат "types." + Тип1СИлиСтрока;
		КонецПопытки;
	ИначеЕсли ТипЗнч(Тип1С) = Тип("ОписаниеТипов") Тогда 
		ТипыИзТипа = Тип1С.Типы();
		Если ТипыИзТипа.Количество() > 0 Тогда
			Тип1С = ТипыИзТипа[0];
		КонецЕсли;
	КонецЕсли;

	МетаданныеТипа=СоответствиеСсылочныхТипов[Тип1С];

	Если МетаданныеТипа = Неопределено Тогда
		Если ТипЗнч(Тип1СИлиСтрока) = Тип("Строка") Тогда
			Попытка
				Стр = Новый(Тип1СИлиСтрока);
				Возврат "classes." + Тип1СИлиСтрока;
			Исключение
				Возврат "types." + Тип1СИлиСтрока;
			КонецПопытки;
		Иначе
			Возврат "";
		КонецЕсли;
	КонецЕсли;

	Если МетаданныеТипа.ВидОбъекта = "Справочник" Тогда
		Возврат "catalogs." + МетаданныеТипа.Имя;
	ИначеЕсли МетаданныеТипа.ВидОбъекта = "Документ" Тогда
		Возврат "documents." + МетаданныеТипа.Имя;
	ИначеЕсли МетаданныеТипа.ВидОбъекта = "Задача" Тогда
		Возврат "tasks." + МетаданныеТипа.Имя;
	ИначеЕсли МетаданныеТипа.ВидОбъекта = "ПланВидовРасчета" Тогда
		Возврат "chartsOfCalculationTypes." + МетаданныеТипа.Имя;
	ИначеЕсли МетаданныеТипа.ВидОбъекта = "ПланВидовХарактеристик" Тогда
		Возврат "chartsOfCharacteristicTypes." + МетаданныеТипа.Имя;
	ИначеЕсли МетаданныеТипа.ВидОбъекта = "ПланОбмена" Тогда
		Возврат "exchangePlans." + МетаданныеТипа.Имя;
	ИначеЕсли МетаданныеТипа.ВидОбъекта = "ПланСчетов" Тогда
		Возврат "сhartsOfAccounts." + МетаданныеТипа.Имя;
	КонецЕсли;

	Возврат "";
КонецФункции

Функция ПолучитьСвязьСОбъектомМетаданныхДляРедактораMonaco(Реквизит, СоответствиеТипов)

	Связь = "";

	Типы = Реквизит.Тип.Типы();

	Индекс = 0;

	Для Каждого ТекТип Из Типы Цикл
		Связь = ТипРедактораМонакоПоСтрокеТипа1С(ТекТип, СоответствиеТипов);

		Если ЗначениеЗаполнено(Связь) Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Возврат Связь;

КонецФункции

Процедура ДобавитьОписаниеРеквизитаДляРедактораMonaco(ОписаниеРеквизитов, Реквизит, ПолучатьСвязиРеквизита,
	СоответствиеТипов)

	Связь = "";
	Если ПолучатьСвязиРеквизита Тогда
		Связь= ПолучитьСвязьСОбъектомМетаданныхДляРедактораMonaco(Реквизит, СоответствиеТипов);
	КонецЕсли;

	ОписаниеРеквизита = Новый Структура("name", Реквизит.Имя);

	Если ЗначениеЗаполнено(Связь) Тогда
		ОписаниеРеквизита.Вставить("ref", Связь);
	КонецЕсли;

	ОписаниеРеквизитов.Вставить(Реквизит.Имя, ОписаниеРеквизита);

КонецПроцедуры

Функция ОписаниеОбъектаМетаданныхДляРедактораMonaco(ОписаниеОбъектаМетаданных)
	СоответствиеТипов = СоответствиеСсылочныхТиповКонфигурации();
	ОписаниеРеквизитов = Новый Структура;
	ОписаниеРесурсов = Новый Структура;
	ОписаниеПредопределенных = Новый Структура;
	ОписаниеТабличныхЧастей = Новый Структура;
	ДополнительныеСвойства = Новый Структура;
	ОписаниеТаблицВнешнихИсточников = Новый Структура;
	ОписаниеКубовВнешнихИсточников = Новый Структура;

	Если ОписаниеОбъектаМетаданных.ВидОбъекта = "Перечисление" Или ОписаниеОбъектаМетаданных.ВидОбъекта
		= "перечисления" Тогда

		Для Каждого КлючЗначениеЗначенияПеречисления Из ОписаниеОбъектаМетаданных.ЗначенияПеречисления Цикл
			ОписаниеРеквизитов.Вставить(КлючЗначениеЗначенияПеречисления.Ключ, Новый Структура("name",
				КлючЗначениеЗначенияПеречисления.Значение));
		КонецЦикла;

	Иначе

		Если ОписаниеОбъектаМетаданных.Свойство("Реквизиты") Тогда
			Для Каждого КлючЗначениеРеквизит Из ОписаниеОбъектаМетаданных.Реквизиты Цикл
				ДобавитьОписаниеРеквизитаДляРедактораMonaco(ОписаниеРеквизитов, КлючЗначениеРеквизит.Значение, Истина,
					СоответствиеТипов);
			КонецЦикла;
		КонецЕсли;
		Если ОписаниеОбъектаМетаданных.Свойство("СтандартныеРеквизиты") Тогда
			Для Каждого КлючЗначениеРеквизит Из ОписаниеОбъектаМетаданных.СтандартныеРеквизиты Цикл
				ДобавитьОписаниеРеквизитаДляРедактораMonaco(ОписаниеРеквизитов, КлючЗначениеРеквизит.Значение, Ложь,
					СоответствиеТипов);
			КонецЦикла;
		КонецЕсли;
		Если ОписаниеОбъектаМетаданных.Свойство("Предопределенные") Тогда
				
				//Если ИмяМетаданных(ПолноеИмя) = "ПланСчетов" Тогда
				//	
				//	Запрос = Новый Запрос(
				//	"ВЫБРАТЬ
				//	|	ПланСчетов.Код КАК Код,
				//	|	ПланСчетов.ИмяПредопределенныхДанных КАК Имя
				//	|ИЗ
				//	|	&Таблица КАК ПланСчетов
				//	|ГДЕ
				//	|	ПланСчетов.Предопределенный");				
				//						
				//	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Таблица", ПолноеИмя);
				//	
				//	Выборка = Запрос.Выполнить().Выбрать();
				//	
				//	Пока Выборка.Следующий() Цикл 
				//		ОписаниеПредопределенных.Вставить(Выборка.Имя, СтрШаблон("%1 (%2)", Выборка.Имя, Выборка.Код));
				//	КонецЦикла;
				//	
				//Иначе				
			Для Каждого КлючЗначениеИмя Из ОписаниеОбъектаМетаданных.Предопределенные Цикл
				ОписаниеПредопределенных.Вставить(КлючЗначениеИмя.Ключ, "");
			КонецЦикла;
				
				//КонецЕсли;

		КонецЕсли;

		Если ОписаниеОбъектаМетаданных.Свойство("Измерения") Тогда

			Для Каждого КлючЗначениеРеквизит Из ОписаниеОбъектаМетаданных.Измерения Цикл
				ДобавитьОписаниеРеквизитаДляРедактораMonaco(ОписаниеРеквизитов, КлючЗначениеРеквизит.Значение, Истина,
					СоответствиеТипов);
			КонецЦикла;
			Для Каждого КлючЗначениеРеквизит Из ОписаниеОбъектаМетаданных.Ресурсы Цикл
				ДобавитьОписаниеРеквизитаДляРедактораMonaco(ОписаниеРеквизитов, КлючЗначениеРеквизит.Значение, Истина,
					СоответствиеТипов);
			КонецЦикла;
				
				//ЗаполнитьТипРегистра(ДополнительныеСвойства, ОбъектМетаданных, ПолноеИмя);				

		КонецЕсли;

		Если ОписаниеОбъектаМетаданных.Свойство("ТабличныеЧасти") Тогда

			Для Каждого КлючЗначениеТабличнаяЧасть Из ОписаниеОбъектаМетаданных.ТабличныеЧасти Цикл

				ТабличнаяЧасть = КлючЗначениеТабличнаяЧасть.Значение;

				ОписаниеТабличнойЧасти = Новый Структура;

				Если ТабличнаяЧасть.Свойство("СтандартныеРеквизиты") Тогда
					Для Каждого РеквизитТЧ Из ТабличнаяЧасть.СтандартныеРеквизиты Цикл
						ОписаниеТабличнойЧасти.Вставить(РеквизитТЧ.Значение.Имя, РеквизитТЧ.Значение.Синоним);
					КонецЦикла;
				КонецЕсли;

				Если ТабличнаяЧасть.Свойство("Реквизиты") Тогда
					Для Каждого РеквизитТЧ Из ТабличнаяЧасть.Реквизиты Цикл
						ДобавитьОписаниеРеквизитаДляРедактораMonaco(ОписаниеТабличнойЧасти, РеквизитТЧ.Значение,
							Истина, СоответствиеТипов);
					КонецЦикла;
				КонецЕсли;

				ОписаниеТабличныхЧастей.Вставить(ТабличнаяЧасть.Имя, Новый Структура("properties",ОписаниеТабличнойЧасти));

			КонецЦикла;

		КонецЕсли;
		Если ОписаниеОбъектаМетаданных.Свойство("СтандартныеТабличныеЧасти") Тогда

			Для Каждого КлючЗначениеТабличнаяЧасть Из ОписаниеОбъектаМетаданных.СтандартныеТабличныеЧасти Цикл

				ТабличнаяЧасть = КлючЗначениеТабличнаяЧасть.Значение;

				ОписаниеТабличнойЧасти = Новый Структура;

				Если ТабличнаяЧасть.Свойство("СтандартныеРеквизиты") Тогда
					Для Каждого РеквизитТЧ Из ТабличнаяЧасть.СтандартныеРеквизиты Цикл
						ОписаниеТабличнойЧасти.Вставить(РеквизитТЧ.Значение.Имя, РеквизитТЧ.Значение.Синоним);
					КонецЦикла;
				КонецЕсли;

				Если ТабличнаяЧасть.Свойство("Реквизиты") Тогда
					Для Каждого РеквизитТЧ Из ТабличнаяЧасть.Реквизиты Цикл
						ДобавитьОписаниеРеквизитаДляРедактораMonaco(ОписаниеТабличнойЧасти, РеквизитТЧ.Значение,
							Истина, СоответствиеТипов);
					КонецЦикла;
				КонецЕсли;

				ОписаниеТабличныхЧастей.Вставить(ТабличнаяЧасть.Имя, Новый Структура("properties",ОписаниеТабличнойЧасти));

			КонецЦикла;

		КонецЕсли;

		Если ОписаниеОбъектаМетаданных.Свойство("Таблицы") Тогда
			Для Каждого КлючЗначениеТаблица Из ОписаниеОбъектаМетаданных.Таблицы Цикл

				ТаблицаВнешнегоИсточника = КлючЗначениеТаблица.Значение;

				ОписаниеТаблицы = Новый Структура;

				Если ТаблицаВнешнегоИсточника.Свойство("Поля") Тогда
					Для Каждого РеквизитТЧ Из ТаблицаВнешнегоИсточника.Поля Цикл
						ОписаниеТаблицы.Вставить(РеквизитТЧ.Значение.Имя, РеквизитТЧ.Значение.Синоним);
					КонецЦикла;
				КонецЕсли;

				ОписаниеТаблицВнешнихИсточников.Вставить(ТаблицаВнешнегоИсточника.Имя, Новый Структура("properties",
					ОписаниеТаблицы));

			КонецЦикла;
		КонецЕсли;
		Если ОписаниеОбъектаМетаданных.Свойство("Кубы") Тогда
			Для Каждого КлючЗначениеТаблица Из ОписаниеОбъектаМетаданных.Кубы Цикл

				КубВнешнегоИсточника = КлючЗначениеТаблица.Значение;

				ОписаниеТаблицы = Новый Структура;

				Если КубВнешнегоИсточника.Свойство("Измерения") Тогда
					Для Каждого РеквизитТЧ Из КубВнешнегоИсточника.Измерения Цикл
						ОписаниеТаблицы.Вставить(РеквизитТЧ.Значение.Имя, РеквизитТЧ.Значение.Синоним);
					КонецЦикла;
				КонецЕсли;
				Если КубВнешнегоИсточника.Свойство("Ресурсы") Тогда
					Для Каждого РеквизитТЧ Из КубВнешнегоИсточника.Ресурсы Цикл
						ОписаниеТаблицы.Вставить(РеквизитТЧ.Значение.Имя, РеквизитТЧ.Значение.Синоним);
					КонецЦикла;
				КонецЕсли;

				ОписаниеКубовВнешнихИсточников.Вставить(КубВнешнегоИсточника.Имя, Новый Структура("properties",
					ОписаниеТаблицы));

			КонецЦикла;
		КонецЕсли;
	КонецЕсли;

	СтруктураОбъекта = Новый Структура;
	СтруктураОбъекта.Вставить("properties", ОписаниеРеквизитов);

	Для Каждого Обход Из ДополнительныеСвойства Цикл
		СтруктураОбъекта.Вставить(Обход.Ключ, Обход.Значение);
	КонецЦикла;

	Если ОписаниеРесурсов.Количество() > 0 Тогда
		СтруктураОбъекта.Вставить("resources", ОписаниеРесурсов);
	КонецЕсли;

	Если ОписаниеПредопределенных.Количество() > 0 Тогда
		СтруктураОбъекта.Вставить("predefined", ОписаниеПредопределенных);
	КонецЕсли;

	Если ОписаниеТабличныхЧастей.Количество() > 0 Тогда
		СтруктураОбъекта.Вставить("tabulars", ОписаниеТабличныхЧастей);
	КонецЕсли;
	
	Если ОписаниеТаблицВнешнихИсточников.Количество() > 0 Тогда
		СтруктураОбъекта.Вставить("tables", Новый Структура("items", ОписаниеТаблицВнешнихИсточников));		
	КонецЕсли;
	
	Если ОписаниеКубовВнешнихИсточников.Количество() > 0 Тогда
		СтруктураОбъекта.Вставить("cubes", ОписаниеКубовВнешнихИсточников);
	КонецЕсли;

	Возврат СтруктураОбъекта;
КонецФункции

Функция ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(Коллекция, СоответствиеТипов)

	ОписаниеКоллекции = Новый Структура;

	Для Каждого КлючЗначениеЭлементКоллекции Из Коллекция Цикл

		ОписаниеРеквизитов = Новый Структура;
		ОписаниеРесурсов = Новый Структура;
		ОписаниеПредопределенных = Новый Структура;
		ОписаниеТабличныхЧастей = Новый Структура;
		ДополнительныеСвойства = Новый Структура;

		ОбъектМетаданных = КлючЗначениеЭлементКоллекции.Значение;

		Если ОбъектМетаданных.ВидОбъекта = "Перечисление" Тогда

			Для Каждого КлючЗначениеЗначенияПеречисления Из ОбъектМетаданных.ЗначенияПеречисления Цикл
				ОписаниеРеквизитов.Вставить(КлючЗначениеЗначенияПеречисления.Ключ, Новый Структура("name",
					КлючЗначениеЗначенияПеречисления.Значение));
			КонецЦикла;

		Иначе

			Если ОбъектМетаданных.Свойство("Реквизиты") Тогда
				Для Каждого КлючЗначениеРеквизит Из ОбъектМетаданных.Реквизиты Цикл
					ДобавитьОписаниеРеквизитаДляРедактораMonaco(ОписаниеРеквизитов, КлючЗначениеРеквизит.Значение,
						Истина, СоответствиеТипов);
				КонецЦикла;
			КонецЕсли;
			Если ОбъектМетаданных.Свойство("СтандартныеРеквизиты") Тогда
				Для Каждого КлючЗначениеРеквизит Из ОбъектМетаданных.СтандартныеРеквизиты Цикл
					ДобавитьОписаниеРеквизитаДляРедактораMonaco(ОписаниеРеквизитов, КлючЗначениеРеквизит.Значение, Ложь,
						СоответствиеТипов);
				КонецЦикла;
			КонецЕсли;
			Если ОбъектМетаданных.Свойство("Предопределенные") Тогда
				
				//Если ИмяМетаданных(ПолноеИмя) = "ПланСчетов" Тогда
				//	
				//	Запрос = Новый Запрос(
				//	"ВЫБРАТЬ
				//	|	ПланСчетов.Код КАК Код,
				//	|	ПланСчетов.ИмяПредопределенныхДанных КАК Имя
				//	|ИЗ
				//	|	&Таблица КАК ПланСчетов
				//	|ГДЕ
				//	|	ПланСчетов.Предопределенный");				
				//						
				//	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Таблица", ПолноеИмя);
				//	
				//	Выборка = Запрос.Выполнить().Выбрать();
				//	
				//	Пока Выборка.Следующий() Цикл 
				//		ОписаниеПредопределенных.Вставить(Выборка.Имя, СтрШаблон("%1 (%2)", Выборка.Имя, Выборка.Код));
				//	КонецЦикла;
				//	
				//Иначе				
				Для Каждого КлючЗначениеИмя Из ОбъектМетаданных.Предопределенные Цикл
					ОписаниеПредопределенных.Вставить(КлючЗначениеИмя.Ключ, Новый Структура("name, ref",
						КлючЗначениеИмя.Ключ, ""));
				КонецЦикла;
				
				//КонецЕсли;

			КонецЕсли;

			Если ОбъектМетаданных.Свойство("Измерения") Тогда

				Для Каждого КлючЗначениеРеквизит Из ОбъектМетаданных.Измерения Цикл
					ДобавитьОписаниеРеквизитаДляРедактораMonaco(ОписаниеРеквизитов, КлючЗначениеРеквизит.Значение,
						Истина, СоответствиеТипов);
				КонецЦикла;
				Для Каждого КлючЗначениеРеквизит Из ОбъектМетаданных.Ресурсы Цикл
					ДобавитьОписаниеРеквизитаДляРедактораMonaco(ОписаниеРеквизитов, КлючЗначениеРеквизит.Значение,
						Истина, СоответствиеТипов);
				КонецЦикла;
				
				//ЗаполнитьТипРегистра(ДополнительныеСвойства, ОбъектМетаданных, ПолноеИмя);				

			КонецЕсли;

			Если ОбъектМетаданных.Свойство("ТабличныеЧасти") Тогда

				Для Каждого КлючЗначениеТабличнаяЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл

					ТабличнаяЧасть = КлючЗначениеТабличнаяЧасть.Значение;
					ОписаниеРеквизитов.Вставить(ТабличнаяЧасть.Имя, Новый Структура("name", "ТЧ: "
						+ ТабличнаяЧасть.Синоним));

					ОписаниеТабличнойЧасти = Новый Структура;

					Если ТабличнаяЧасть.Свойство("СтандартныеРеквизиты") Тогда
						Для Каждого РеквизитТЧ Из ТабличнаяЧасть.СтандартныеРеквизиты Цикл
							ОписаниеТабличнойЧасти.Вставить(РеквизитТЧ.Значение.Имя, РеквизитТЧ.Значение.Синоним);
						КонецЦикла;
					КонецЕсли;

					Если ТабличнаяЧасть.Свойство("Реквизиты") Тогда
						Для Каждого РеквизитТЧ Из ТабличнаяЧасть.Реквизиты Цикл
							ДобавитьОписаниеРеквизитаДляРедактораMonaco(ОписаниеТабличнойЧасти, РеквизитТЧ.Значение,
								Истина, СоответствиеТипов);
						КонецЦикла;
					КонецЕсли;

					ОписаниеТабличныхЧастей.Вставить(ТабличнаяЧасть.Имя, ОписаниеТабличнойЧасти);

				КонецЦикла;

			КонецЕсли;
			Если ОбъектМетаданных.Свойство("СтандартныеТабличныеЧасти") Тогда

				Для Каждого КлючЗначениеТабличнаяЧасть Из ОбъектМетаданных.СтандартныеТабличныеЧасти Цикл

					ТабличнаяЧасть = КлючЗначениеТабличнаяЧасть.Значение;
					ОписаниеРеквизитов.Вставить(ТабличнаяЧасть.Имя, Новый Структура("name", "ТЧ: "
						+ ТабличнаяЧасть.Синоним));

					ОписаниеТабличнойЧасти = Новый Структура;

					Если ТабличнаяЧасть.Свойство("СтандартныеРеквизиты") Тогда
						Для Каждого РеквизитТЧ Из ТабличнаяЧасть.СтандартныеРеквизиты Цикл
							ОписаниеТабличнойЧасти.Вставить(РеквизитТЧ.Значение.Имя, РеквизитТЧ.Значение.Синоним);
						КонецЦикла;
					КонецЕсли;

					Если ТабличнаяЧасть.Свойство("Реквизиты") Тогда
						Для Каждого РеквизитТЧ Из ТабличнаяЧасть.Реквизиты Цикл
							ДобавитьОписаниеРеквизитаДляРедактораMonaco(ОписаниеТабличнойЧасти, РеквизитТЧ.Значение,
								Истина, СоответствиеТипов);
						КонецЦикла;
					КонецЕсли;

					ОписаниеТабличныхЧастей.Вставить(ТабличнаяЧасть.Имя, ОписаниеТабличнойЧасти);

				КонецЦикла;

			КонецЕсли;

		КонецЕсли;

		СтруктураОбъекта = Новый Структура;
		СтруктураОбъекта.Вставить("properties", ОписаниеРеквизитов);

		Для Каждого Обход Из ДополнительныеСвойства Цикл
			СтруктураОбъекта.Вставить(Обход.Ключ, Обход.Значение);
		КонецЦикла;

		Если 0 < ОписаниеРесурсов.Количество() Тогда
			СтруктураОбъекта.Вставить("resources", ОписаниеРесурсов);
		КонецЕсли;

		Если 0 < ОписаниеПредопределенных.Количество() Тогда
			СтруктураОбъекта.Вставить("predefined", ОписаниеПредопределенных);
		КонецЕсли;

		Если 0 < ОписаниеТабличныхЧастей.Количество() Тогда
			СтруктураОбъекта.Вставить("tabulars", ОписаниеТабличныхЧастей);
		КонецЕсли;

		ОписаниеКоллекции.Вставить(ОбъектМетаданных.Имя, СтруктураОбъекта);

	КонецЦикла;

	Возврат ОписаниеКоллекции;

КонецФункции

Функция ПолучитьСписокОбъектовМетаданныхИзКоллекцииДляРедактораMonaco(Коллекция)

	ОписаниеКоллекции = Новый Структура;

	Для Каждого КлючЗначение Из Коллекция Цикл
		ОписаниеКоллекции.Вставить(КлючЗначение.Ключ, Новый Структура);
	КонецЦикла;

	Возврат ОписаниеКоллекции;

КонецФункции

Функция СоответствиеСсылочныхТиповКонфигурации()
	Соответствие = УИ_ПараметрыПриложения["СоответствиеСсылочныхТиповКонфигурации"];
	Если Соответствие <> Неопределено Тогда
		Возврат Соответствие;
	КонецЕсли;

	СоответствиеТипов = УИ_РедакторКодаВызовСервера.СоответствиеСсылочныхТипов();
	УИ_ПараметрыПриложения.Вставить("СоответствиеСсылочныхТиповКонфигурации", СоответствиеТипов);

	Возврат СоответствиеТипов;
КонецФункции

Функция ОписаниеМетаданныхКонфигурацииДляРедактораMonaco()
	ОписаниеМетаданных = УИ_ПараметрыПриложения["ОписаниеМетаданныхДляРедактораMonaco"];
	Если ОписаниеМетаданных <> Неопределено Тогда
		Возврат ОписаниеМетаданных;
	КонецЕсли;

	АдресОписанияМетаданных = УИ_ПараметрыПриложения["АдресОписанияМетаданныхКонфигурации"];
	Если Не ЭтоАдресВременногоХранилища(АдресОписанияМетаданных) Тогда
		АдресОписанияМетаданных = УИ_ОбщегоНазначенияВызовСервера.АдресОписанияМетаданныхКонфигурации();
		УИ_ПараметрыПриложения.Вставить("АдресОписанияМетаданныхКонфигурации", АдресОписанияМетаданных);
	КонецЕсли;
	МетаданныеКонфигурации = ПолучитьИзВременногоХранилища(АдресОписанияМетаданных);

	СоответствиеТипов = МетаданныеКонфигурации.СоответствиеСсылочныхТипов;

	КоллекцияМетаданных = Новый Структура;
	КоллекцияМетаданных.Вставить("catalogs", ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(
		МетаданныеКонфигурации.Справочники, СоответствиеТипов));
	КоллекцияМетаданных.Вставить("documents", ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(
		МетаданныеКонфигурации.Документы, СоответствиеТипов));
	КоллекцияМетаданных.Вставить("infoRegs", ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(
		МетаданныеКонфигурации.РегистрыСведений, СоответствиеТипов));
	КоллекцияМетаданных.Вставить("accumRegs", ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(
		МетаданныеКонфигурации.РегистрыНакопления, СоответствиеТипов));
	КоллекцияМетаданных.Вставить("accountRegs", ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(
		МетаданныеКонфигурации.РегистрыБухгалтерии, СоответствиеТипов));
	КоллекцияМетаданных.Вставить("calcRegs", ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(
		МетаданныеКонфигурации.РегистрыРасчета, СоответствиеТипов));
	КоллекцияМетаданных.Вставить("dataProc", ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(
		МетаданныеКонфигурации.Обработки, СоответствиеТипов));
	КоллекцияМетаданных.Вставить("reports", ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(
		МетаданныеКонфигурации.Отчеты, СоответствиеТипов));
	КоллекцияМетаданных.Вставить("enums", ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(
		МетаданныеКонфигурации.Перечисления, СоответствиеТипов));
	КоллекцияМетаданных.Вставить("commonModules", ПолучитьСписокОбъектовМетаданныхИзКоллекцииДляРедактораMonaco(
		МетаданныеКонфигурации.ОбщиеМодули));
	КоллекцияМетаданных.Вставить("сhartsOfAccounts", ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(
		МетаданныеКонфигурации.ПланыСчетов, СоответствиеТипов));
	КоллекцияМетаданных.Вставить("businessProcesses", ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(
		МетаданныеКонфигурации.БизнесПроцессы, СоответствиеТипов));
	КоллекцияМетаданных.Вставить("tasks", ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(
		МетаданныеКонфигурации.Задачи, СоответствиеТипов));
	КоллекцияМетаданных.Вставить("exchangePlans", ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(
		МетаданныеКонфигурации.ПланыОбмена, СоответствиеТипов));
	КоллекцияМетаданных.Вставить("chartsOfCharacteristicTypes", ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(
		МетаданныеКонфигурации.ПланыВидовХарактеристик, СоответствиеТипов));
	КоллекцияМетаданных.Вставить("chartsOfCalculationTypes", ОписатьКоллекциюОбъектовМетаданыхДляРедактораMonaco(
		МетаданныеКонфигурации.ПланыВидовРасчета, СоответствиеТипов));
	КоллекцияМетаданных.Вставить("constants", ПолучитьСписокОбъектовМетаданныхИзКоллекцииДляРедактораMonaco(
		МетаданныеКонфигурации.Константы));

	УИ_ПараметрыПриложения.Вставить("ОписаниеМетаданныхДляРедактораMonaco",
		УИ_ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(КоллекцияМетаданных));
	УИ_ПараметрыПриложения.Вставить("СоответствиеСсылочныхТиповКонфигурации", СоответствиеТипов);

	Возврат КоллекцияМетаданных;
КонецФункции

// Вид объекта метаданных по виду метаданных от редактора monaco.
// 
// Параметры:
//  ВидМетаданныхMonaco -Строка - Вид метаданных monaco
// 
// Возвращаемое значение:
//  Строка
Функция ВидОбъектаМетаданныхПоВидуМетаданныхОтРедактораMonaco(ВидМетаданныхMonaco)
	Если НРег(ВидМетаданныхMonaco) = "inforegs" Тогда
		Возврат "informationregisters";
	ИначеЕсли НРег(ВидМетаданныхMonaco) = "accumregs" Тогда
		Возврат "accumulationregisters";
	ИначеЕсли НРег(ВидМетаданныхMonaco) = "accountregs" Тогда
		Возврат "accountingregisters";
	ИначеЕсли НРег(ВидМетаданныхMonaco) = "calcregs" Тогда
		Возврат "calculationregisters";
	ИначеЕсли НРег(ВидМетаданныхMonaco) = "dataproc" Тогда
		Возврат "dataprocessors";
	Иначе
		Возврат ВидМетаданныхMonaco;
	КонецЕсли;
КонецФункции

Функция СоответствиеОбновляемыхОбъектовМетаданныхРедактораMonacoИПараметровСобытияОблновленияМетаданных()
	Соответствие = Новый Структура;
	Соответствие.Вставить("справочники", "catalogs.items");
	Соответствие.Вставить("catalogs", "catalogs.items");
	Соответствие.Вставить("документы", "documents.items");
	Соответствие.Вставить("documents", "documents.items");
	Соответствие.Вставить("регистрысведений", "infoRegs.items");
	Соответствие.Вставить("informationregisters", "infoRegs.items");
	Соответствие.Вставить("infoRegs", "infoRegs.items");
	Соответствие.Вставить("регистрынакопления", "accumRegs.items");
	Соответствие.Вставить("accumulationregisters", "accumRegs.items");
	Соответствие.Вставить("accumRegs", "accumRegs.items");
	Соответствие.Вставить("регистрыбухгалтерии", "accountRegs.items");
	Соответствие.Вставить("accountingregisters", "accountRegs.items");
	Соответствие.Вставить("accountRegs", "accountRegs.items");
	Соответствие.Вставить("регистрырасчета", "calcRegs.items");
	Соответствие.Вставить("calculationregisters", "calcRegs.items");
	Соответствие.Вставить("calcRegs", "calcRegs.items");
	Соответствие.Вставить("обработки", "dataProc.items");
	Соответствие.Вставить("dataprocessors", "dataProc.items");
	Соответствие.Вставить("dataProc", "dataProc.items");
	Соответствие.Вставить("отчеты", "reports.items");
	Соответствие.Вставить("reports", "reports.items");
	Соответствие.Вставить("перечисления", "enums.items");
	Соответствие.Вставить("enums", "enums.items");
	Соответствие.Вставить("планысчетов", "сhartsOfAccounts.items");
	Соответствие.Вставить("chartsofaccounts", "сhartsOfAccounts.items");
	Соответствие.Вставить("бизнеспроцессы", "businessProcesses.items");
	Соответствие.Вставить("businessprocesses", "businessProcesses.items");
	Соответствие.Вставить("задачи", "tasks.items");
	Соответствие.Вставить("tasks", "tasks.items");
	Соответствие.Вставить("планыобмена", "exchangePlans.items");
	Соответствие.Вставить("exchangeplans", "exchangePlans.items");
	Соответствие.Вставить("планывидовхарактеристик", "chartsOfCharacteristicTypes.items");
	Соответствие.Вставить("chartsofcharacteristictypes", "chartsOfCharacteristicTypes.items");
	Соответствие.Вставить("планывидоврасчета", "chartsOfCalculationTypes.items");
	Соответствие.Вставить("chartsofcalculationtypes", "chartsOfCalculationTypes.items");
	Соответствие.Вставить("константы", "constants.items");
	Соответствие.Вставить("constants", "constants.items");
	Соответствие.Вставить("module", "commonModules.items");
	Соответствие.Вставить("externaldatasources", "externalDataSources.items");
	Соответствие.Вставить("внешниеисточникиданных", "externalDataSources.items");

	Возврат Соответствие;
КонецФункции

Функция ЕстьДобавленныеКомандыКонтекстногоМенюРедактораMonaco(ДокументView)
	КомандыРедактора = ДокументView.editor.getSupportedActions();
	Для Каждого ТекКоманда Из КомандыРедактора Цикл
		Если Не СтрЗаканчиваетсяНа(ТекКоманда.id, "_bsl") Тогда
			Продолжить;
		КонецЕсли;
		
		ЧастиИдентификатора = СтрРазделить(ТекКоманда.id, ":");  
		Идентификатор = ЧастиИдентификатора[ЧастиИдентификатора.Количество()-1];
		ЧастиИдентификатор = СтрРазделить(Идентификатор, ".");
		Если УИ_СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(ЧастиИдентификатор[0]) Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Ложь;
КонецФункции

#КонецОбласти

#Область ACE
// Событие для обработки при нажатии monaco.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения -Форма
//  Элемент - ПолеФормы-Элемент
//  ДанныеСобытия  -ФиксированнаяСтруктура- Данные события
// 
// Возвращаемое значение:
//  см. НовыйСобытиеРедактораКодаДляОбработки
// Возвращаемое значение:
//  Неопределено - Событие не требует обработки
Функция СобытиеДляОбработкиПриНажатииAce(Форма, Элемент, ДанныеСобытия)
	Событие = ДанныеСобытия.Event.detail;

	Если Событие = Неопределено Или ТипЗнч(Событие)=Тип("Число") Тогда
		Возврат Неопределено;
	КонецЕсли;
//	СтандартнаяОбработка = Ложь;
		
	СобытиеДляОбработки = НовыйСобытиеРедактораКодаДляОбработки();
	СобытиеДляОбработки.Элемент = Элемент;
	СобытиеДляОбработки.ИмяСобытия = Событие.name;
	
	ДанныеСобытияДляОбработки = Неопределено;

	//Тут получение спец данных для события
	
	СобытиеДляОбработки.ДанныеСобытия = ДанныеСобытияДляОбработки;

	Возврат СобытиеДляОбработки;	
КонецФункции

// Добавить к сохранению текстовый документ для языка редактора кода ace.
// 
// Параметры:
//  СоответствиеФайловБиблиотеки - Соответствие из КлючИЗначение - Соответствие файлов библиотеки:
// * Ключ - Строка - 
// * Значение - Строка, ДвоичныеДанные, ТекстовыйДокумент - 
//  БиблиотекаРедактора - см. УИ_РедакторКодаКлиентСервер.НовыйБиблиотекаРедактораКодаФормы 
//  Язык - Строка - Язык
Процедура ДобавитьКСохранениюТекстовыйДокументДляЯзыкаРедактораКодаAce(СоответствиеФайловБиблиотеки,
	БиблиотекаРедактора, Язык)
	Текст= Новый ТекстовыйДокумент;
	Текст.УстановитьТекст(УИ_РедакторКодаКлиентСервер.ТекстHTMLРедактораКодаAce(БиблиотекаРедактора, Язык));

	СоответствиеФайловБиблиотеки.Вставить(Язык + ".html", Текст);

КонецПроцедуры

#КонецОбласти

// Сохранить библиотеку редактора на диск.
// 
// Параметры:
//  БиблиотекаРедактора - см. УИ_РедакторКодаКлиентСервер.НовыйБиблиотекаРедактораКодаФормы
//  ОписаниеОповещенияОЗавершении - ОписаниеОповещения
Процедура СохранитьБиблиотекуРедактораНаДиск(БиблиотекаРедактора, ОписаниеОповещенияОЗавершении)
	ФайлРедактора=Новый Файл(БиблиотекаРедактора.КаталогСохраненияБиблиотеки);

	ДопПараметры= Новый Структура;
	ДопПараметры.Вставить("БиблиотекаРедактора", БиблиотекаРедактора);
	ДопПараметры.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);
	ФайлРедактора.НачатьПроверкуСуществования(
		Новый ОписаниеОповещения("СохранитьБиблиотекуРедактораНаДискЗавершениеПроверкиСуществованияБиблиотекиНаДиске",
		ЭтотОбъект, ДопПараметры));
КонецПроцедуры

Процедура СохранитьБиблиотекуРедактораЗаписатьНачатьЗаписьОчередногоФайла(ДополнительныеПараметры)
	МассивСохраненныхФайлов = ДополнительныеПараметры.МассивСохраненныхФайлов;
	КаталогСохраненияБибилиотеки = ДополнительныеПараметры.БиблиотекаРедактора.КаталогСохраненияБиблиотеки;
	СоответствиеФайловБиблиотеки = ДополнительныеПараметры.СоответствиеФайловБиблиотеки;
	ЕстьНеСохраненное = Ложь;
	Для Каждого КлючЗначение Из СоответствиеФайловБиблиотеки Цикл
		Если МассивСохраненныхФайлов.Найти(КлючЗначение.Ключ) <> Неопределено Тогда
			Продолжить;
		КонецЕсли;
		ЕстьНеСохраненное = Истина;

		ИмяФайла=КаталогСохраненияБибилиотеки + ПолучитьРазделительПути() + КлючЗначение.Ключ;
		ДополнительныеПараметры.Вставить("ТекКлючФайла", КлючЗначение.Ключ);

		ДанныеСохранения = КлючЗначение.Значение;
		Если ТипЗнч(ДанныеСохранения) = Тип("Строка") И ЭтоАдресВременногоХранилища(ДанныеСохранения) Тогда
			ДанныеСохранения = ПолучитьИзВременногоХранилища(ДанныеСохранения);
		КонецЕсли;

		Если ТипЗнч(ДанныеСохранения) = Тип("ТекстовыйДокумент") Тогда
			ОповещениеОЗаверешении = Новый ОписаниеОповещения("СохранитьБиблиотекуРедактораЗаписатьНачатьЗаписьОчередногоФайлаТекстовогоДокументаЗавершение",
				ЭтотОбъект, ДополнительныеПараметры);
		Иначе
			ОповещениеОЗаверешении = Новый ОписаниеОповещения("СохранитьБиблиотекуРедактораЗаписатьНачатьЗаписьОчередногоФайлаЗавершение",
				ЭтотОбъект, ДополнительныеПараметры);
		КонецЕсли;

		ДанныеСохранения.НачатьЗапись(ОповещениеОЗаверешении, ИмяФайла);
		Прервать;
	КонецЦикла;

	Если Не ЕстьНеСохраненное Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеОповещенияОЗавершении, Истина);
	КонецЕсли;
КонецПроцедуры

// Сохранить очередную библиотеку редактора на диск.
// 
// Параметры:
//  ДополнительныеПараметры - Структура:
//  	* Форма - ФормаКлиентскогоПриложения
//  	* ОписаниеОповещенияОЗавершении - ОписаниеОповещения
Процедура СохранитьОчереднуюБиблиотекуРедактораНаДиск(ДополнительныеПараметры)
	ДанныеБиблиотекРедакторов =  ДополнительныеПараметры.Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаДанныеБиблиотекРедакторов()];
	
	ВсеБиблиотекиУжеРаспакованы= Истина;
	Для Каждого КлючЗначение Из ДанныеБиблиотекРедакторов Цикл
		ТекущаяБиблиотека = КлючЗначение.Значение; //см. УИ_РедакторКодаКлиентСервер.НовыйБиблиотекаРедактораКодаФормы
		Если Не ТекущаяБиблиотека.НеобходимоРаспаковатьНаКлиенте Тогда
			Продолжить;
		КонецЕсли;
		Если ТекущаяБиблиотека.БиблиотекаРаспакована Тогда
			Продолжить;
		КонецЕсли;
		ВсеБиблиотекиУжеРаспакованы = Ложь;
		
		ТекущаяБиблиотека.КаталогСохраненияБиблиотеки = КаталогСохраненияРедактора(ТекущаяБиблиотека.ВидРедактора);
		
		ПараметрыОповещения = Новый Структура;
		ПараметрыОповещения.Вставить("КлючБиблиотеки", КлючЗначение.Ключ);
		ПараметрыОповещения.Вставить("Форма", ДополнительныеПараметры.Форма);
		ПараметрыОповещения.Вставить("ОписаниеОповещенияОЗавершении", ДополнительныеПараметры.ОписаниеОповещенияОЗавершении);

		СохранитьБиблиотекуРедактораНаДиск(ТекущаяБиблиотека,
										   Новый ОписаниеОповещения("ФормаПриОткрытииЗавершениеСохраненияОчереднойБиблиотекиРедактора",
			ЭтотОбъект, ПараметрыОповещения));
		
		Прервать;
	КонецЦикла;
	
	Если ВсеБиблиотекиУжеРаспакованы Тогда
		ФормаПриОткрытииЗавершениеСохраненияБиблиотекРедакторов(Истина, ДополнительныеПараметры);
	КонецЕсли; 
	
	
КонецПроцедуры

Функция КаталогСохраненияРедактора(ВидРедактора)
	СтруктураФайловыхПеременных=УИ_ОбщегоНазначенияКлиент.СтруктураФайловыхПеременныхСеанса();
	Если Не СтруктураФайловыхПеременных.Свойство("РабочийКаталогДанныхПользователя") Тогда
		Возврат "";
	КонецЕсли;

	Возврат УИ_ОбщегоНазначенияКлиент.КаталогВспомогательныхБиблиотекИнструментов() + ПолучитьРазделительПути()
		+ ВидРедактора;
КонецФункции

// Новый параметры сборки обработок для редакторов.
// 
// Возвращаемое значение:
//  Структура - Новый параметры сборки обработок для редакторов:
// * ОписаниеОповещенияОЗавершении - ОписаниеОповещения, Неопределено -
// * РедакторыДляСборки - Массив из см. УИ_РедакторКодаКлиентСервер.НовыйДанныеРедактораДляСборкиОбработки-
// * ИндексРедактораДляСборки - Число -
// * КаталогШаблонаОбработки - Строка -
// * Форма - ФормаКлиентскогоПриложения,Неопределено -
// * КонтекстКомандыКонфигуратора - см. УИ_УправлениеКонфигураторомКлиент.НовыйКонтекстКомандыКонфигуратора, Неопределено -
Функция НовыйПараметрыСборкиОбработокДляРедакторов()
	ПараметрыСборки = Новый Структура();
	ПараметрыСборки.Вставить("ОписаниеОповещенияОЗавершении", Неопределено);
	ПараметрыСборки.Вставить("РедакторыДляСборки", Новый Массив);
	ПараметрыСборки.Вставить("ИндексРедактораДляСборки", 0);
	ПараметрыСборки.Вставить("КаталогШаблонаОбработки", "");
	ПараметрыСборки.Вставить("КонтекстКомандыКонфигуратора", Неопределено);
	ПараметрыСборки.Вставить("Форма", Неопределено);
	
	Возврат ПараметрыСборки;
КонецФункции
	
// К полю HTMLРедактора подключен скрипт взаимодействия.
// 
// Параметры:
//  ДокументView -ВнешнийОбъект-Документ view
// 
// Возвращаемое значение:
//  Булево -  К полю HTMLРедактора подключен скрипт взаимодействия
Функция КПолюHTMLРедактораПодключенСкриптВзаимодействия(ДокументView) 
	Возврат ДокументView.colaborator <> Неопределено;
КонецФункции	
	
	
// Подключить к полю HTMLСкрипт взаимодействия.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  ПараметрыРедактора - см. УИ_РедакторКодаКлиентСервер.НовыйДанныеРедактораФормы 
//  ДокументHTML - ВнешнийОбъект
Процедура ПодключитьКПолюHTMLСкриптВзаимодействия(Форма, ПараметрыРедактора, ДокументHTML)
	ВидыРедакторов = УИ_РедакторКодаКлиентСервер.ВариантыРедактораКода();
	ВидРедактора = УИ_РедакторКодаКлиентСервер.ВидРедактораКодаФормы(Форма);

	ИмяМакетаБиблиотеки = "";
	Если ВидРедактора = ВидыРедакторов.Ace Тогда
		ИмяМакетаБиблиотеки = "УИ_AceColaborator";
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(ИмяМакетаБиблиотеки) Тогда
		ВозвраТ;
	КонецЕсли;

	ДанныеБиблиотекРедакторов = Форма[УИ_РедакторКодаКлиентСервер.ИмяРеквизитаРедактораКодаДанныеБиблиотекРедакторов()];//Структура

	ИмяБиблиотекиВзаимодействияДляДанныхФормы = УИ_РедакторКодаКлиентСервер.ИмяБиблиотекиВзаимодействияДляДанныхФормы(ВидРедактора);

	Если ДанныеБиблиотекРедакторов.Свойство(ИмяБиблиотекиВзаимодействияДляДанныхФормы) Тогда
		ДанныеБиблитекиВзаимодейтсвия = ПолучитьИзВременногоХранилища(ДанныеБиблиотекРедакторов[ИмяБиблиотекиВзаимодействияДляДанныхФормы]);
	Иначе
		ДанныеБиблитекиВзаимодейтсвия = УИ_РедакторКодаВызовСервера.ДанныеБиблиотекиОбщегоМакета(ИмяМакетаБиблиотеки,
																								 Форма.УникальныйИдентификатор);
		ДанныеБиблиотекРедакторов.Вставить(ИмяБиблиотекиВзаимодействияДляДанныхФормы,
										   ПоместитьВоВременноеХранилище(ДанныеБиблитекиВзаимодейтсвия,
																		 Форма.УникальныйИдентификатор));
	КонецЕсли;
	
	ПодключитьБиблиотекуКДокументуПоляHTML(ДокументHTML, ДанныеБиблитекиВзаимодейтсвия);
КонецПроцедуры	
	
// Подключить библиотеку к документу поля HTML.
// 
// Параметры:
//  ДокументView - ВнешнийОбъект- Документ view
//  ДанныеБиблиотеки - см. УИ_РедакторКодаСервер.
Процедура ПодключитьБиблиотекуКДокументуПоляHTML(ДокументView, ДанныеБиблиотеки)
	Для Каждого ТекСкрипт Из ДанныеБиблиотеки.Скрипты Цикл
		Элемент = ДокументView.document.createElement("script");
		Элемент.type = "text/javascript";
		Элемент.src = ТекСкрипт;
		ДокументView.document.body.appendChild(Элемент);	
	КонецЦикла;
	
	Для Каждого ТекСкрипт Из ДанныеБиблиотеки.Стили Цикл
		Элемент = ДокументView.document.createElement("style");
		Элемент.innerHTML = ТекСкрипт;
		ДокументView.document.body.appendChild(Элемент);	
	КонецЦикла;
КонецПроцедуры	

// Добавляет пользовательский пункт меню в контекстное меню редактора
// 
// Параметры:
//  ДокументView - ВнешнийОбъект - 
//  ЕстьДобавленныеКомандыКонтекстногоМенюРедактораMonaco - Булево
//  Идентификатор - Строка - Идентификатор команды меню
//  Наименование - Строка - Наименование команды меню
Процедура ДобавитьПунктМеню(ДокументView, ЕстьДобавленныеКомандыКонтекстногоМенюРедактораMonaco, Идентификатор,
	Наименование)
	Если ЕстьДобавленныеКомандыКонтекстногоМенюРедактораMonaco Тогда
		Возврат;
	КонецЕсли;
	ДокументView.addContextMenuItem(Наименование, Идентификатор);
КонецПроцедуры

// Установить кэш редактора формы.
// 
// Параметры:
//  ПараметрыРедактора - см. УИ_РедакторКодаКлиентСервер.НовыйДанныеРедактораФормы
//  Текст - Строка, Неопределено -
//  ОригинальныйТекст - Строка, Неопределено -
//  
Процедура УстановитьКэшРедактораФормы(ПараметрыРедактора, Текст = Неопределено, ОригинальныйТекст = Неопределено)
	КэшТекстаРедактора = ПараметрыРедактора.КэшТекстаРедактора;
	Если КэшТекстаРедактора = Неопределено Тогда
		КэшТекстаРедактора = УИ_РедакторКодаКлиентСервер.НовыйКэшТекстовРедактора();
	КонецЕсли;

	Если Текст <> Неопределено Тогда	
		КэшТекстаРедактора.Текст = Текст;
	КонецЕсли;
	Если ОригинальныйТекст <> Неопределено Тогда
		КэшТекстаРедактора.ОригинальныйТекст = ОригинальныйТекст;
	КонецЕсли;
	ПараметрыРедактора.КэшТекстаРедактора = КэшТекстаРедактора;

КонецПроцедуры

#КонецОбласти